首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将与委托相关的函数移动到不同的线程。

将与委托相关的函数移动到不同的线程。
EN

Stack Overflow用户
提问于 2010-04-28 11:26:08
回答 3查看 1.3K关注 0票数 0

我们正在C#中开发一个与串口通信的库。我们有一个赋予代表的功能。问题是我们希望它在不同的线程中运行。

我们尝试创建一个新线程(名为DatafromBot),但是继续使用它,如下所示(第一行):

代码语言:javascript
复制
comPort.DataReceived += new SerialDataReceivedEventHandler(comPort_DataReceived);

DatafromBot = new Thread(comPort_DataReceived);
DatafromBot.Start();

comPort_DataReceived被定义为:

代码语言:javascript
复制
Thread DatafromBot;
public void comPort_DataReceived(object sender, SerialDataReceivedEventArgs e) {  ... }

发生下列错误:

'System.Threading.Thread.Thread(System.Threading.ThreadStart)‘的最佳重载方法匹配有一些无效的参数C:...\IR52cLow\CommunicationManager.cs 180 27 IR52cLow

错误4参数“1”:无法从“方法组”转换为“System.Threading.ThreadStart”C:...\IR52cLow\CommunicationManager.cs 180 38 IR52cLow

有什么想法,我们应该如何转换,以使它的编译?请注意comPort.DataReceived (请注意“。而不是“_”,它位于系统库中,不能修改。

EN

回答 3

Stack Overflow用户

发布于 2010-04-28 11:33:05

每个Delegate都有一个名为BeginInvoke()的方法。调用时,此方法将调用新线程上的函数。所以你不需要明确地去做。例如

代码语言:javascript
复制
public delegate string delegate1(int x);

Delegate1 d1 = new Delegate1(Add);

D1.BeginInvoke(10, null, null);

在这里,Add方法运行在次要线程上。主线程继续其操作,不等待辅助线程结束。主线程不会知道辅助线程何时结束。

如果方法完成时需要通知,则可以使用AsyncCallback类。

代码语言:javascript
复制
D1.BeginInvoke(10, AsyncCallback(AddComplete), null);

在这里,当辅助线程完成执行时,它会在其线程上调用AddComplete()方法。主线程不等待辅助线程。

检查MSDN。

票数 2
EN

Stack Overflow用户

发布于 2010-04-28 14:28:03

这是不好的,DataReceived事件是在SerialPort接收到东西时触发的。您不能只是启动一个线程,并希望从端口中读取一些内容。

更重要的是,DataReceived事件已经在单独的线程上运行。SerialPort类使用线程池线程来运行事件。使用您自己的线程从端口读取数据是可以的,但是您不想使用DataReceived。只需使用阻塞调用,任何ReadXxx()方法都可以限定。

票数 1
EN

Stack Overflow用户

发布于 2010-04-28 11:28:10

代码语言:javascript
复制
new Thread(() => comPort_DataReceived(null, null));

您还可以传递参数发送方和事件:

代码语言:javascript
复制
var e = new SerialDataReceivedEventArgs();
new Thread(() => comPort_DataReceived(comPort, e));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2728957

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档