我们正在用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
(注意“。”而不是“_”)位于系统库中,无法修改。
答案 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));