Bar*_*osz 1 c# parallel-processing asynchronous async-await
我已经使用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("");
}
Run Code Online (Sandbox Code Playgroud)
我期望它的运行速度比内联处理快两倍,因为PerformSlowOperation可以并行运行。我的期望是将同时生成sum1_2和sum2_2,而基于Stopwatch日志对结果的分析表明,这两个值的处理方式与内联处理情况完全相同。两种情况下的总时间也相同。为什么会这样呢?
C#await关键字完全按照单词的意思进行操作,它在继续执行下一行之前等待函数完成执行。如果您不使用await关键字,那么它将在后台运行并继续执行其余代码,但是这不允许您对结果做任何事情。
要并行运行这两个任务,您需要明确声明要等待所有任务完成才能继续,而不仅仅是等待每个任务。
Task t1 = Task<double>.Factory.StartNew(() => opr1.PerformSlowOperation(1, true));
Task t2 = Task<double>.Factory.StartNew(() => opr2.PerformSlowOperation(1, true));
await Task.WhenAll(t1,t2);
var sum1_2 = t1.Result;
var sum2_2 = t2.Result;
Run Code Online (Sandbox Code Playgroud)
上面的代码将等到两者都完成后再并行运行,然后再继续其余的代码。
关键字存在的原因不是要启用并行任务,而是使应用程序在执行其余代码之前等待单个异步方法完成。这在ASP.NET中非常有用,在ASP.NET中,长时间运行的任务会浪费线程,await从而使ASP.NET放弃对另一个请求的线程控制,直到上一个任务的长时间运行请求完成,然后再执行确实完成了对线程的控制权。
| 归档时间: |
|
| 查看次数: |
83 次 |
| 最近记录: |