我正在使用Microsoft.Bcl.Async nuget包来使用异步/等待(我的目标是.NET 4,而不是4.5)
我不熟悉异步/等待。下面的代码示例描述了我的问题。为什么不调用突出显示的行?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AsyncTest
{
class Program
{
static void Main(string[] args)
{
Run();
Console.WriteLine("Got the value");
Console.ReadKey();
}
public static async void Run()
{
Console.WriteLine("Testing Async...");
var val = await AsyncMethod();
// HIGHLIGHTED LINE. WHY IS THIS LINE NOT CALLED?
Console.WriteLine("And the value is... {0}", val);
}
public static Task<long> AsyncMethod()
{
long myVal = 1;
for (long l = 0; l < 100000; l++)
{
myVal++;
Console.WriteLine("l = {0}", l);
}
return new Task<long>(() => myVal);
}
}
}发布于 2013-02-07 20:57:04
这行代码:
Console.WriteLine("And the value is... {0}", val);被转换(由编译器)为延续;只有当被“等待”的任务完成时,它才会被调用(带有值等)。问题是:你创建了一个任务,但是你还没有启动它:所以它永远不会完成。
如果您从底部创建的任务开始,它将最终完成。另外,通常你会把“正在做”的工作放在Task里面,而不是放在它外面:
public static Task<long> AsyncMethod()
{
var task = new Task<long>(() =>
{
long myVal = 1;
for (long l = 0; l < 100000; l++)
{
myVal++;
Console.WriteLine("l = {0}", l);
}
return myVal;
});
task.Start();
return task;
}还要注意,Got the value在 And the value is...之前很久就打印出来了--这是因为延续发生在工作线程上;Run方法在第一个await将控制权返回给调用者(Main)。
发布于 2013-08-06 15:14:17
你不应该叫它"AsyncMethod“,因为它没有异步元素。
该方法使用一个任务,该任务将在与当前线程不同的线程中运行。
https://stackoverflow.com/questions/14751614
复制相似问题