【问题标题】:C# 4.5 Task Parallel in windows forms [duplicate]Windows窗体中的C#4.5任务并行[重复]
【发布时间】:2018-04-17 15:14:15
【问题描述】:

我有一个所有方法都是异步的第三方库,我有一些问题

1) 这两行代码有什么区别?

Task.Run(async () => await MethodAsync());
Task.Run(() => PrepareDashBoard());

2) 当我需要从按钮点击事件中调用异步方法时,哪个是正确的?

// A.
private void Button_Click(object sender, EventArgs e)
{
  //A Task Run call from questions 1) a or b with call to Wait or Result (if return something)
}

// B
private async void Button_Click(object sender, EventArgs e) 
{
  await MethodAsync();
}

【问题讨论】:

  • 文档和标记的副本完全回答了您的问题。

标签: c# winforms async-await task-parallel-library


【解决方案1】:

TL;DR:在您了解其含义之前,请勿将任务并行库(Task<T> 等)与asyncawait(除了在async 函数返回类型的定义中)混合使用。

要在没有 WinForms 甚至处理程序的情况下调用异步函数,只需使用

var res = await theFunction(args);

WinForms 运行时知道如何处理线程管理(因此所有 GUI 交互都停留在一个线程上)。

回复。 Q1:

一个。启动新的异步任务以异步调用 async 方法,并在内部任务开始运行时完成。这不太可能是您想要的。

b.在异步任务中运行 lambda,当 lambda 完成时,任务被标记为完成。

附言。当 C#5 发布时,有很多文章涵盖了 async 和 WinForms 的交互,比这里的答案更详细。

【讨论】:

  • 对第一个问题的更正,关于这两个代码行之间的区别是什么?代码行是 Task.Run(async () => await MethodAsync()); Task.Run(() => PrepareDashBoard()); 如果我理解正确,你告诉我,我不能直接使用 Task.Run 与 async 混合并等待?
  • 在没有等待的情况下运行异步方法的正确方法是什么?
  • @ManosKanelopoulos:这很复杂(使用Task<T>Result 属性的简单情况不会处理执行上下文(IIRC))。因此:找到文档并阅读它们。
猜你喜欢
  • 2013-03-07
  • 1970-01-01
  • 1970-01-01
  • 2018-11-28
  • 1970-01-01
  • 2011-08-14
  • 2018-07-05
  • 2016-11-17
  • 1970-01-01
相关资源
最近更新 更多