【发布时间】:2017-05-24 04:26:11
【问题描述】:
这是一个非常简单的例子,可以在互联网上找到Async/Await概念,我想知道这个小逻辑如何使用Begin/End Invoke来实现? 我需要做的就是使用两种方法(Async/Await 和委托)准备一个复杂的逻辑,所以我想从一个基本的工作流程开始。
int countCharacters()
{
int count = 0;
using (StreamReader reader= new StreamReader("D:\\Data.txt"))
{
string content = reader.ReadToEnd();
count = content.Length;
Thread.Sleep(5000);
}
return count;
}
private async void btnProcessFIle_Click(object sender, EventArgs e)
{
Task<int> task = new Task<int>(countCharacters);
task.Start();
int count = await task;
lblCount.Text = "No. of characters in file=" +Environment.NewLine+ count.ToString();
}
【问题讨论】:
-
我很好奇。为什么要使用非常好的 async/await 代码并将其转换为使用 Begin/End Invoke?开始/结束调用是这样做的旧方法。一旦你开始使用 async/await,除了提交家庭作业之外,没有其他理由需要这样做。
-
你试过什么?您具体遇到了什么问题?从字面上看,only
Begin/EndInvoke()不可能做你想做的事,因为它们不包括await所具有的在完成后将你带回正确线程的功能。您需要添加对Control.Invoke()的调用来完成此操作,或者使用Progress<T>,或者使用SynchronizationContext,或者......好吧,正如你所看到的,你的问题太广泛了,除了没有包括一个很好的minimal reproducible example 帮助我们了解你真正需要帮助的地方。 -
@PeterDuniho 我所知道的是:当我在异步方法中使用此 KW 调用任何方法时,Await 是一个暂停点,该函数将在后台运行。我只想使用痛苦的结构 Begin/EndInvoke 映射相同的逻辑。因为 Delegates 是传统的异步编程方式,而 Async/Await 从 4.5 版开始就一直存在。
-
@bradgonesurfing- 先生,我同意你的观点,这是我需要向其他人(我的队友)展示的内容,因此我提出了这个问题。
-
@Eqra 问题的代码有问题。您不应该使用冷任务,只需使用 Task.Run。此外,如果异步方法已经可用,则不应使用 Task.Run。否则,你只会浪费一个线程。使用
ReadToEndAsync而不是ReadToEnd
标签: c# winforms delegates async-await