【发布时间】:2016-04-03 13:30:16
【问题描述】:
我使用 async 关键字编写了一个方法,但无法理解它的结果,以及它不起作用的原因:
static async void ExampleWithValueReturned_Async(Stopwatch sw, SlowOperation opr1, SlowOperation opr2)
{
Console.WriteLine("Started processing ASYNC. Start: {0}", sw.Elapsed);
sw.Start();
Console.WriteLine("2 Step0: {0}", sw.Elapsed);
var sum1_2 = await Task<double>.Factory.StartNew(() => opr1.PerformSlowOperation(1, true));
Console.WriteLine("2 Step1: {0}", sw.Elapsed);
var sum2_2 = await Task<double>.Factory.StartNew(() => opr2.PerformSlowOperation(1, true));
Console.WriteLine("2 Step2: {0}", sw.Elapsed);
Console.WriteLine("Operation 1 gave sum: {0}", sum1_2.ToString("0.##"));
Console.WriteLine("Operation 2 gave sum: {0}", sum2_2.ToString("0.##"));
Console.WriteLine("Stopped processing ASYNC. Stop: {0}", sw.Elapsed);
sw.Stop();
sw.Reset();
Console.WriteLine("");
}
我预计它的运行速度大约是内联处理的两倍,因为 PerformSlowOperation 将并行运行。我的期望是同时生成 sum1_2 和 sum2_2,而基于 Stopwatch 日志的结果分析表明,这两个值的处理方式与内联处理情况完全相同。在这两种情况下,总时间也是相同的。为什么会这样?
【问题讨论】:
-
附带说明,
Task.Factory.StartNew是一个危险的 API。请改用Task.Run。 -
尽量避免异步 void 结构。在this 页面上查找更多信息。
-
@JeroenHeier 为您的反馈干杯。会看看
标签: c# asynchronous parallel-processing async-await