我正在使用Microsoft.Bcl.Async nuget包来使用Async / Await(我的目标是.NET 4,而不是4.5)
我是Async / Await的新手。我的问题在以下代码示例中描述。为什么没有调用突出显示的行?
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);
}
}
}
答案 0 :(得分:5)
该行:
Console.WriteLine("And the value is... {0}", val);
被(由编译器)转换为 continuation ;只有在“等待”的任务完成时才会调用它(使用值等)。问题是:你创建任务,但你没有启动它:所以它永远不会完成。
如果您启动您在底部创建的任务,它将最终完成。此外,通常你会把“做”工作放在里面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
方法会在第一个Main
将控件返回给调用者(await
)。
答案 1 :(得分:-1)
您不应将其称为“AsyncMethod”,因为它没有异步元素。
该方法使用一个将在当前线程的单独线程中运行的任务。