0

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

2 回答 2

1

ATask将被创建,否则您的代码将无法工作。但它不同于Task用于并行处理的那些,我认为这就是“并行任务”的含义。

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

于 2013-10-23T10:01:38.003 回答
0

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

private static async Task<IEnumerable<string>> SomeAsyncMethod()
{
await Task.Factory.StartNew(() => Thread.Sleep(TimeSpan.FromMinutes(10)));
return new List<string>();
}
于 2013-10-23T10:06:46.630 回答