C# 为什么没有创建任务?
在测试一些实现选项时,我偶然发现了一些关于第三方物流的不明确问题。 基本上,我的问题是,当调用异步任务返回方法时,是否创建了任务?在下面的代码中,将发生什么C# 为什么没有创建任务?,c#,task-parallel-library,async-await,C#,Task Parallel Library,Async Await,在测试一些实现选项时,我偶然发现了一些关于第三方物流的不明确问题。 基本上,我的问题是,当调用异步任务返回方法时,是否创建了任务?在下面的代码中,将发生什么 public static void Main(string[] args){ Task t = SomeAsyncMethod() Task.WaitAll(t) } private static async Task<IEnumerable<string>> SomeAsyncMethod(
public static void Main(string[] args){
Task t = SomeAsyncMethod()
Task.WaitAll(t)
}
private static async Task<IEnumerable<string>> SomeAsyncMethod()
{
//some implementation
}
publicstaticvoidmain(字符串[]args){
任务t=SomeAsyncMethod()
Task.WaitAll(t)
}
私有静态异步任务SomeAsyncMethod()
{
//一些实现
}
我假设应该在这段代码中创建一个任务,但是在查看“并行任务调试”窗口时,没有创建任何任务。请你澄清一下
更新:
斯维克很好地解释了上述情况,并提出了一个后续问题。
下面的代码是创建两个任务还是只创建一个任务?当主要目标是创建单独的任务时,这是否是一种良好的做法:
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;
}
publicstaticvoidmain(字符串[]args){
Task t=Task.Factory.StartNew(SomeAsyncMethodWrapper());
}
私有异步void SomeAsyncMethodWrappe(){
ver result=等待异步方法();
//对结果做点什么
}
专用静态异步任务(){
//执行一些操作并返回结果值
var innerResult=wait someLibraryAsyncMethod();
返回结果;
}
将创建一个任务
,否则代码将无法工作。但它是一种不同于用于并行处理的任务,我认为这就是“并行任务”的含义
区别在于,“正常的”
Task
s基本上是一些通常在ThreadPool
上执行的同步代码的包装。另一方面,异步Task
s在发生某些事情时完成(一些信息从磁盘读取;async
method完成),但它们并不直接表示某些代码,也从不与线程关联。如果您想在并行任务窗口中查看任务,则方法应该是这样的
private static async Task<IEnumerable<string>> SomeAsyncMethod()
{
await Task.Factory.StartNew(() => Thread.Sleep(TimeSpan.FromMinutes(10)));
return new List<string>();
}
private静态异步任务SomeAsyncMethod()
{
wait Task.Factory.StartNew(()=>Thread.Sleep(TimeSpan.frommins(10));
返回新列表();
}
作为旁注,您应该更喜欢Task.Run
而不是Task.Factory.StartNew
,就像我一样。回答下面的问题:您的代码原样将创建一个基于代码的任务和一个基于事件的任务。基于代码的任务是短期的(即,在第一次wait
产生后,它不会执行代码)。@StephenCleary,很棒的博客!您能否详细说明基于代码的任务与基于事件的任务?当Toub有一些旧的但仍然相关的博客文章和我的博客文章时,链接也会起作用。