关于winforms:C#4.5任务并行Windows窗体

C# 4.5 Task Parallel in windows forms

本问题已经有最佳答案,请猛点这里访问。

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
// 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();
}


tl;dr:除非您了解其含义,否则不要将任务并行库(Task等)与asyncawait直接混合使用(async函数返回类型的定义除外)。

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

1
var res = await theFunction(args);

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

重新。Q1:

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

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

附言:当C 5发布时,有许多文章涵盖了async和winforms的交互作用,比这里的答案更为详细。