在任务运行时返回数据
本文关键字:数据 返回 运行时 任务 | 更新日期: 2023-09-27 18:10:42
我的c#主窗口在点击按钮时启动一个taskfactory任务。该任务应该从串行设备收集数据,但不只是一次。它应该"实时"收集数据。串行模块向该串行设备发送请求。当设备应答时,它应该将数据返回给主窗口(我用事件尝试过)并再次开始收集数据:开始任务:
private void menuStartLog_Click(object sender, RoutedEventArgs e)
{
Librarys.SerialCom Comport = new Librarys.SerialCom();
Task<string> serialThread = Task<string>.Factory.StartNew(() => Comport.ADVInfo(), TaskCreationOptions.LongRunning);
textBoxMain.Text = serialThread.Result;
}
这个方法叫做:
public string ADVInfo()
{
openConnection();
if (Comport.IsOpen)
{
Comport.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
while (true)
{
Console.WriteLine("Serial Task started.");
byte[] SerialRequest = new byte[3] { 0xF0, 0x02, 0x0D };
Comport.Write(SerialRequest.ToString());
Console.WriteLine("Serial Thread completed.");
//Here the task should return data to the mainwindow and request new data
}
}
return ("No open Comport!!!");
}
private static void DataReceivedHandler(
object sender,
SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
string indata = sp.ReadExisting();
Console.WriteLine("Data Received:");
Console.Write(indata);
}
但是串行通信线程阻塞了主线程。我可以在主线程中返回数据而不等待,例如与事件?
不要用.Result
阻塞,而应该用StartNew
创建的Task
阻塞await
。这样,当操作执行时,控制权将返回给消息循环:
private async void menuStartLog_Click(object sender, RoutedEventArgs e)
{
Librarys.SerialCom Comport = new Librarys.SerialCom();
Task<string> serialThread = Task<string>.Factory.StartNew(() => Comport.ADVInfo(), TaskCreationOptions.LongRunning);
textBoxMain.Text = await serialThread;
}
如果您想从ComPort
生成多个字符串,您可以使用yield return
返回IEnumerable<string>
。