Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么没有创建任务?_C#_Task Parallel Library_Async Await - Fatal编程技术网

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有一些旧的但仍然相关的博客文章和我的博客文章时,链接也会起作用。