在测试一些实施选项时,我偶然发现了一些关于TPL的不明确问题。 基本上我的问题是,当调用异步任务返回方法时,是否创建了一个任务?在下面的代码中,会发生什么?
public static void Main(string[] args){
Task t = SomeAsyncMethod()
Task.WaitAll(t)
}
private static async Task<IEnumerable<string>> SomeAsyncMethod()
{
//some implementation
}
我假设应该在此代码中创建一个Task,但是在观察Parallel Task Debug窗口时没有创建任务。请你澄清一下。
更新: svick对上面的场景做了很好的解释,这引发了一个后续问题。 以下代码是创建两个Task还是只创建一个?当主要目标是创建单独的任务时,这是一种好的做法吗:
public static void Main(string[] args) {
Task t = Task.Factory.StartNew(SomeAsyncMethodWrapper());
}
private async void SomeAsyncMethodWrappe(){
ver result = await AsyncMethod();
//do something with the result
}
private static async Task<IEnumerable<string>>(){
//do some work and return a result value
var innerResult = await someLibraryAsyncMethod();
return innerResult;
}
答案 0 :(得分:1)
将创建Task
,否则您的代码无效。但它与用于并行处理的Task
不同,我认为这是“并行任务”的含义。
不同之处在于,“普通”Task
基本上是围绕某些通常在ThreadPool
上执行的同步代码的包装器。另一方面,async Task
在事件发生时完成(从磁盘读取一些信息; async
方法完成),但它们不直接表示某些代码,并且从不与线程关联
答案 1 :(得分:0)
方法应该是这样的。
private static async Task<IEnumerable<string>> SomeAsyncMethod()
{
await Task.Factory.StartNew(() => Thread.Sleep(TimeSpan.FromMinutes(10)));
return new List<string>();
}