我们正在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) { ... }发生下列错误:
'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 (请注意“。而不是“_”,它位于系统库中,不能修改。
发布于 2010-04-28 11:33:05
每个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。
发布于 2010-04-28 14:28:03
这是不好的,DataReceived事件是在SerialPort接收到东西时触发的。您不能只是启动一个线程,并希望从端口中读取一些内容。
更重要的是,DataReceived事件已经在单独的线程上运行。SerialPort类使用线程池线程来运行事件。使用您自己的线程从端口读取数据是可以的,但是您不想使用DataReceived。只需使用阻塞调用,任何ReadXxx()方法都可以限定。
发布于 2010-04-28 11:28:10
new Thread(() => comPort_DataReceived(null, null));您还可以传递参数发送方和事件:
var e = new SerialDataReceivedEventArgs();
new Thread(() => comPort_DataReceived(comPort, e));https://stackoverflow.com/questions/2728957
复制相似问题