在任务运行时返回数据

本文关键字:数据 返回 运行时 任务 | 更新日期: 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>