为什么没有创建任务?

时间:2013-10-23 09:17:01

标签: c# task-parallel-library async-await

在测试一些实施选项时,我偶然发现了一些关于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;
}

2 个答案:

答案 0 :(得分:1)

将创建Task,否则您的代码无效。但它与用于并行处理的Task不同,我认为这是“并行任务”的含义。

不同之处在于,“普通”Task基本上是围绕某些通常在ThreadPool上执行的同步代码的包装器。另一方面,async Task在事件发生时完成(从磁盘读取一些信息; async方法完成),但它们不直接表示某些代码,并且从不与线程关联

答案 1 :(得分:0)

如果你想在Parallel Tasks窗口中看到任务,

方法应该是这样的。

private static async Task<IEnumerable<string>> SomeAsyncMethod()
{
await Task.Factory.StartNew(() => Thread.Sleep(TimeSpan.FromMinutes(10)));
return new List<string>();
}