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

Posted

技术标签:

【中文标题】Windows窗体中的C#4.5任务并行[重复]【英文标题】:C# 4.5 Task Parallel in windows forms [duplicate] 【发布时间】: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();

【问题讨论】:

文档和标记的副本完全回答了您的问题。 【参考方案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))。因此:找到文档并阅读它们。

以上是关于Windows窗体中的C#4.5任务并行[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Windows 窗体 - C# - 要求管理员权限 [重复]

C# 在高效的 Windows 服务中安排重复任务的最佳方法

在 C++/CLI 中并行执行程序

C# - 从 Windows 服务启动 Windows 窗体 [重复]

C#,当我在 Windows 窗体应用程序中发送电子邮件时,图像显示为空白 [重复]

c# windows窗体中的文本框