C# 在任务运行时返回数据

C# 在任务运行时返回数据,c#,.net,multithreading,async-await,task-parallel-library,C#,.net,Multithreading,Async Await,Task Parallel Library,单击按钮时,我的C#主窗口将启动taskfactory任务。 该任务应该从串行设备收集数据,但不能只收集一次。 它应该“实时”收集数据。 串行模块向该串行设备发送请求。当设备应答时,它应该将数据返回到主窗口(我尝试了一个事件),并再次开始收集数据: 启动任务: private void menuStartLog_Click(object sender, RoutedEventArgs e) { Librarys.SerialCom Comport = new Librarys.Seri

单击按钮时,我的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;
}
但是用于串行通信的线程阻塞了主线程。
我是否可以在主线程中不等待的情况下返回数据,例如使用事件?

而不是使用
.Result
进行阻止,您应该
等待
StartNew
创建的
任务。这样,在执行操作时,控制权会退回到消息循环:

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;
}
private async void菜单启动日志\u单击(对象发送方,路由目标)
{
Librarys.SerialCom Comport=new Librarys.SerialCom();
Task serialThread=Task.Factory.StartNew(()=>Comport.ADVInfo(),TaskCreationOptions.LongRunning);
Text=wait serialThread;
}

如果要从
ComPort
生成多个字符串,可以使用
yield return

返回
IEnumerable
,因为等待结果仍然发生在主线程中。等待ADVInfo()和return任务。
ADVInfo
本身应该使用TaskCompletionSource实现异步,如图所示
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;
}