将委托相关的函数移动到另一个线程

时间:2010-04-28 11:26:09

标签: c# delegates serial-port

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

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

comPort.DataReceived += new SerialDataReceivedEventHandler(comPort_DataReceived);

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

comPort_DataReceived定义为:

Thread DatafromBot;
public void comPort_DataReceived(object sender, SerialDataReceivedEventArgs e) {  ... }

发生以下错误:

  

错误3最佳重载方法   匹配'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(注意“。”而不是“_”)位于系统库中,无法修改。

3 个答案:

答案 0 :(得分:2)

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

public delegate string delegate1(int x);

Delegate1 d1 = new Delegate1(Add);

D1.BeginInvoke(10, null, null);

此处Add方法在辅助线程上运行。主线程继续其操作,不等待辅助线程结束。主线程将不知道辅助线程何时结束。

如果您在方法完成时需要通知,那么您可以AsyncCallback上课。

D1.BeginInvoke(10, AsyncCallback(AddComplete), null);

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

检查MSDN。

答案 1 :(得分:1)

这不可行,当SerialPort收到某些内容时会触发DataReceived事件。你不能只是启动一个线程,并希望有一些东西可以从端口读取。

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

答案 2 :(得分:0)

new Thread(() => comPort_DataReceived(null, null));

你也可以传递参数sender和eventargs:

var e = new SerialDataReceivedEventArgs();
new Thread(() => comPort_DataReceived(comPort, e));