为什么没有创建任务

本文关键字:任务 创建 为什么 | 更新日期: 2023-09-27 18:36:35

在测试一些实现选项时,我偶然发现了一些关于TPL的不清楚的问题。基本上我的问题是,当调用异步任务返回方法时,是否创建了任务?在下面的代码中,会发生什么?

public static void Main(string[] args){
    Task t = SomeAsyncMethod()
    Task.WaitAll(t)  
}
private static async Task<IEnumerable<string>> SomeAsyncMethod()
{
        //some implementation
}

我假设应该在此代码中创建一个任务,但是在观看并行任务调试窗口时,没有创建任务。请你澄清一下。

更新:Svick对上述场景给出了很好的解释,这就产生了一个后续问题。以下代码将创建两个任务还是仅创建一个任务?当主要目标是创建单独的任务时,这是好的做法吗?

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;
}

为什么没有创建任务

将创建一个Task,否则您的代码无法工作。但它与用于并行处理的Task不同,我认为这就是"并行任务"的含义。

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

如果您想在"并行任务"窗口中查看任务,方法应该是这样的。

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