提问者:小点点

C#4.5 windows窗体中的任务并行[重复]


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

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();
}

共1个答案

匿名用户

TLDR:在理解其含义之前,不要直接将任务并行库(CodeTask<T>/code>等)与混合使用(函数返回类型的定义除外)。

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

var res = await theFunction(args);

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

关于Q1:

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

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

附注:当C.5发布时,有许多文章涉及和WinForms之间的交互,详细程度远远超过了这里的答案。