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>
等)与async
和await
(除了在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# - 从 Windows 服务启动 Windows 窗体 [重复]