C# 新线程里面无法调用DLL中的方法,DLL是引用第三方的

LGQ2017 2017-08-31 10:43:24
大家好: 我是一名C#初学者,在学习过程中遇到一个问题,请大家帮忙指点,问题描述如下:

建立了一个窗体应用程序的项目,引用了第三方的DLL文件,在主程序中调用DLL中的方法没有问题,但是在新开的线程里调用方法时,没有任何反应,猜测是调用失败了,

请大家指点一下,该如何在新线程里面调用第三方DLL中的方法,谢谢!!

不知道有没有把问题描述清楚,
...全文
419 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
学习
LGQ2017 2017-08-31
  • 打赏
  • 举报
回复
引用 7 楼 sp1234 的回复:
[quote=引用 5 楼 LGQ2017 的回复:] 我在主程序里面新建了一个线程,新线程循环调用另外一个方法,方法里有段代码,该段代码执行共享约250ms才能执行完毕,主要是调用第三方DLL文件中的方法响应太慢,在这250ms时间内如果点击主程序中的其它控件,整个程序将会卡死,因此将这段代码放在新线程里面执行,结果出现了上述现象
这说明“新线程”是个死路,撤销了。[/quote] 没有明白您的意思,能说的详细点吗,有什么方法可以解决吗
LGQ2017 2017-08-31
  • 打赏
  • 举报
回复
引用 6 楼 eqmaster 的回复:
看来必须要委托主线程来执行了!
请问怎样委托主线程啊
  • 打赏
  • 举报
回复
引用 5 楼 LGQ2017 的回复:
我在主程序里面新建了一个线程,新线程循环调用另外一个方法,方法里有段代码,该段代码执行共享约250ms才能执行完毕,主要是调用第三方DLL文件中的方法响应太慢,在这250ms时间内如果点击主程序中的其它控件,整个程序将会卡死,因此将这段代码放在新线程里面执行,结果出现了上述现象
这说明“新线程”是个死路,撤销了。
LGQ2017 2017-08-31
  • 打赏
  • 举报
回复
引用 3 楼 u014038019 的回复:
dll里面的这个方法有更新Ui的操作吗,有的话用委托
使用过委托,可以调用,但是有一些问题,具体描述如下: 我在主程序里面新建了一个线程,新线程循环调用另外一个方法,方法里有段代码,该段代码执行共享约250ms才能执行完毕,主要是调用第三方DLL文件中的方法响应太慢,在这250ms时间内如果点击主程序中的其它控件,整个程序将会卡死,因此将这段代码放在新线程里面执行,结果出现了上述现象
LGQ2017 2017-08-31
  • 打赏
  • 举报
回复
不好意思,刚才描述错了,出现的现象是: 主线程没有影响,不报错,新线程里面调用的DLL方法,方法执行的特别慢, 近乎卡死,后续的非调用方法语句正常速度执行(毫秒级),请问这是什么原因啊
zhiranmo 2017-08-31
  • 打赏
  • 举报
回复
dll里面的这个方法有更新Ui的操作吗,有的话用委托
LGQ2017 2017-08-31
  • 打赏
  • 举报
回复
主程序没有影响,也没有出现什么错误,只是新线程里面 那个调用语句后面的代码都没有执行
xdashewan 2017-08-31
  • 打赏
  • 举报
回复
失败原因是什么,错误信息是什么
LGQ2017 2017-08-31
  • 打赏
  • 举报
回复
private void Cmd_GetPos_Click(object sender, EventArgs e) { if (GetPos_iCount % 2 == 0) { GetPosBool = true; CommOpen_nCid = OpenComm(1); if (CommOpen_nCid >= 0) { CommClose_nCid = -1; newthread= new Thread(crossThread); newthread.IsBackground = true; newthread.Start(); } else { Ms_BscCloseComm(CommOpen_nCid); CommBool = false; } } else { GetPosBool = false; } GetPos_iCount++; } private void crossThread() { CommBool = true; while (GetPosBool) { if(!newthreadpuse){getposfunction();} Thread.Sleep(1000); } } private void getposfunction() { if (textBox_GetPos_X.InvokeRequired) { delegatefunction getpos_delegate = new delegatefunction(getposfunction); BeginInvoke(getpos_delegate); } else { short rc; rc = GetPos(CommOpen_nCid, out P_var[0]);//第三方DLL中的方法 if (rc == 0) { textBox_GetPos_X.Text = Convert.ToString(P_var[0]); } else { richTextBox1.AppendText("GetPos failure>>"); } CommClose_nCid = CloseComm(CommOpen_nCid); while (true) {if (CommClose_nCid == 0) { break; } } CommBool = false; } } getposfunction()方法中的代码执行需要250ms左右; 当在主程序里面点击按钮事件时,会使newthreadpuse变为true,然后等待getposfunction()结束后, CommClose_nCid = CloseComm(CommOpen_nCid); CommClose_nCid为0时,控件才能调用DLL中的方法, 因为必须先调用 OpenComm();方法建立通讯,而后才能调用DLL中的方法,调用其中的方法之后再调用CommClose()方法关闭通讯,如此循环。 这是我第一次尝试的方法,再newthread开启的时候点击主线程中其它控件经常会卡死(但不是每次都卡死); 所以我就把跨线程调用控件检查关闭了,Control.CheckForIllegalCrossThreadCalls = false; 然后将getposfunction()内的代码转移到crossthread中,直接进行循环调用,结果出现了调用方法响应太慢,近乎卡死的现象。

110,534

社区成员

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

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

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