【问题标题】:Return data while task is running任务运行时返回数据
【发布时间】:2015-09-01 20:32:57
【问题描述】:

单击按钮时,我的 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);
}

但是串行通信的线程阻塞了主线程。 我可以在不等待主线程的情况下返回数据吗,例如有活动吗?

【问题讨论】:

  • 因为等待结果仍然发生在你​​的主线程中。
  • 等待 ADVInfo() 并返回任务.

标签: c# .net multithreading async-await task-parallel-library


【解决方案1】:

您应该使用await Task 创建StartNew,而不是使用.Result 阻止。这样,在操作执行时,控制权就交还给消息循环:

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&lt;string&gt;

【讨论】:

  • ADVInfo 本身应该使用 TaskCompletionSource 进行异步处理,例如 here
猜你喜欢
  • 2021-10-07
  • 2022-11-18
  • 2018-08-02
  • 1970-01-01
  • 1970-01-01
  • 2018-08-06
  • 1970-01-01
  • 2020-09-13
  • 1970-01-01
相关资源
最近更新 更多