太郁闷了, 同一个方法, 在主线程执行速度相当快, 放到线程中调用, 却要几秒到十几秒

rija0026 2010-12-06 05:04:59
方法来自是一个C++的动态链接库

现在C#来调用, 主线程中速度很快, 但在线程中,却需要几秒钟时间 , 大家有没有遇到过这样的问题, 是什么原因造成的呢?
...全文
195 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
rija0026 2010-12-07
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 hangang7403 的回复:]

电脑同时运行很多程序,分配给非主线程的时间片段比较少
[/Quote]

不存在这样的情况啊..只有一个子线程.
hangang7403 2010-12-07
  • 打赏
  • 举报
回复
电脑同时运行很多程序,分配给非主线程的时间片段比较少
rija0026 2010-12-07
  • 打赏
  • 举报
回复
自己再顶
rija0026 2010-12-07
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 happyrain2010 的回复:]

在后台执行
backgroudwork
action
Invoke
[/Quote]

使用backgroudwork 速度与在线程中、Begininvoke是一样的慢, Invoke速度也很快, 因为都是在主线程

高手帮忙分析一下.谢谢
happyrain2010 2010-12-07
  • 打赏
  • 举报
回复
在后台执行
backgroudwork
action
Invoke
rija0026 2010-12-07
  • 打赏
  • 举报
回复
代码如下, 相当简单的一个方法


private void button1_Click(object sender, EventArgs e)
{
Thread Thread1 = new Thread(new ThreadStart(SendToX1));
Thread1.Start();
}


// 调用DLL方法
private void SendToX1()
{
byte[] bMsgId = new byte[256];
byte[] bMsgBuffer = new byte[4096];
int iRst = 0;

bMsgId = UnicodeEncoding.UTF8.GetBytes("ABCD");
bMsgBuffer = UnicodeEncoding.UTF8.GetBytes("sadfsafsafsadf");

// 调用DLL中的发送方法
iRst = ClsDll.Send(bMsgId, bMsgBuffer, bMsgBuffer.Length);
Console.WriteLine(DateTime.Now.ToString());
}


主线程中执行SendToX1, 速度相当快, 但是在线程中执行, 到ClsDll.Send()这句话时, 就相当慢,至少7秒以上,才会收到返回值.太郁闷了......
百战天王 2010-12-07
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 hangang7403 的回复:]

电脑同时运行很多程序,分配给非主线程的时间片段比较少
[/Quote]一般继承主线程优先级吧
莫名其 2010-12-07
  • 打赏
  • 举报
回复
继续建议:用Stopwatch类分别记录下从调用线程到结束的时间及该方法的运行时间。
Dobzhansky 2010-12-07
  • 打赏
  • 举报
回复
操作系统是优待 UI 线程的, 尤其是包含当前激活窗口的,

但不至于出现这么严重的差别.
足球中国 2010-12-07
  • 打赏
  • 举报
回复
应该不对有这么大的差距。楼主把代码贴出来看看。
如果楼主加锁了或等待了。肯定就会慢了。
jiewei915 2010-12-07
  • 打赏
  • 举报
回复
jincaomao 2010-12-06
  • 打赏
  • 举报
回复
用窗体对象的.invoke()方法, 在主线程里执行不就行了。
马老虎 2010-12-06
  • 打赏
  • 举报
回复
rija0026 2010-12-06
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 flyerwing 的回复:]

那样肯定慢.
[/Quote]

为什么? 在主线程一闪而过的方法 , 为什么放到线程中调用,最慢的时候要等上十几秒?
flyerwing 2010-12-06
  • 打赏
  • 举报
回复
那样肯定慢.
rija0026 2010-12-06
  • 打赏
  • 举报
回复
自己顶一下, 很急的问题.会不会与我的DLL封装有关系?
rija0026 2010-12-06
  • 打赏
  • 举报
回复
我觉得与优先级没有关系, 用的是线程控件 BackGroundWorker , 并且方法实现并不耗CPU, 不至于会用到十多秒钟.
stickking 2010-12-06
  • 打赏
  • 举报
回复
应该是优先级的问题。
莫名其 2010-12-06
  • 打赏
  • 举报
回复
或许是线程的优先级问题,用Stopwatch类分别记录下从调用线程到结束的时间及该方法的运行时间。
然后对比一下应该就明白怎么回事了

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧