Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.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#Task.Run不等待操作变量_C#_Lambda_Async Await_Task - Fatal编程技术网

C#Task.Run不等待操作变量

C#Task.Run不等待操作变量,c#,lambda,async-await,task,C#,Lambda,Async Await,Task,参见示例代码 Console.WriteLine("start") Task.Run(async () => { await Task.Delay(3000); }); Console.WriteLine("end"); // result // start [3s delay] end 它起作用了! 但下面的代码不起作用 Action action = async () => { await Task.Delay(3000); }; Console.Write

参见示例代码

Console.WriteLine("start")
Task.Run(async () =>
{
    await Task.Delay(3000);
});
Console.WriteLine("end");

// result 
// start [3s delay] end
它起作用了! 但下面的代码不起作用

Action action = async () =>
{
    await Task.Delay(3000);
};
Console.WriteLine("start")
Task.Run(action);
Console.WriteLine("end");

// result
// start [without delay] end
为什么
Task.Run
不等待异步操作变量

编辑-------------------------

我很抱歉。我写错代码了。 这是正确的代码

我在VS2017的C#Interactive上进行了测试

Console.WriteLine("start");
await Task.Run(async () =>
{
    await Task.Delay(3000);
});
Console.WriteLine("end");

Action action = async () =>
{
    await Task.Delay(3000);
};
Console.WriteLine("start");
await Task.Run(action);
Console.WriteLine("end");

使用async和Tasks的主要原因是使两个或多个方法同时运行。因此,您的方法将继续运行,当完成延迟时,将调用延迟后的任何内容,因为您在任务中运行了另一个异步func

如果运行此方法,您会注意到

完成

将打印在其他工作的中间(在这里,其他工作是<代码> for循环< /代码>,

Console.WriteLine("start");
Task.Run(async () =>
 {
     await Task.Delay(200);
      Console.WriteLine("Finished");
 });

 for(int i = 0; i < 500; i++)
    {
       Console.WriteLine(i);
    }
Console.WriteLine("end");
Console.ReadKey();
Console.WriteLine(“开始”);
Task.Run(异步()=>
{
等待任务。延迟(200);
控制台。写入线(“完成”);
});
对于(int i=0;i<500;i++)
{
控制台写入线(i);
}
控制台。写入线(“结束”);
Console.ReadKey();
由于某些原因,它在dotnetfiddle上的工作效果不如预期

即使任务中没有运行异步,它们也将同时运行

看看这个例子:

 Console.WriteLine("start");
            Task.Run(() =>
            {
                Task.Delay(2000).Wait(); // Will NOT wait !
                Console.WriteLine("Finished");
            });

            for(int i = 0; i < 500; i++)
            {
                Console.WriteLine(i);
            }
            Console.WriteLine("end");
            Console.ReadKey();
Console.WriteLine(“开始”);
Task.Run(()=>
{
Task.Delay(2000).Wait();//不会等待!
控制台。写入线(“完成”);
});
对于(int i=0;i<500;i++)
{
控制台写入线(i);
}
控制台。写入线(“结束”);
Console.ReadKey();
它将毫不延迟地继续,因为它正在执行任务

但是如果您想让方法等待,首先:不要在任务上运行它。 第二:调用Wait()方法

比如:

Console.WriteLine("start");

Task.Delay(2000).Wait(); // It'll wait for 2 seconds before continue.

for(int i = 0; i < 500; i++)
  {
     Console.WriteLine(i);
  }
 Console.WriteLine("end");
 Console.ReadKey();
Console.WriteLine(“开始”);
Task.Delay(2000).Wait();//它将等待2秒钟,然后继续。
对于(int i=0;i<500;i++)
{
控制台写入线(i);
}
控制台。写入线(“结束”);
Console.ReadKey();
您可以尝试以下方法:

Action action = async () =>
                {
                    await Task.Delay(3000);
                };
                Console.WriteLine("start");
                Task.Run(action).Wait();                
                Console.WriteLine("end");

当使用
任务时。在不等待的情况下运行
,这只会“触发并忘记”。代码执行不会等待它,它只会在
线程池中有
线程时运行它

通常,如果要卸载某些工作并等待该工作完成,请创建一个单独的方法,返回
任务
,然后
等待

示例

Console.WriteLine("start")
await DoWorkAsync();
Console.WriteLine("end");

/////////
private Task DoWorkAsync()
{
  return Task.Run(async () =>
  {
     await Task.Delay(3000);
  });
}
请注意,不建议将方法主体包装到
任务中并返回它,这通常会导致一点代码味道

Stephen Cleary对
任务
异步/等待
有很好的了解。我会仔细阅读以下内容:


将像这样工作,但不是很明显:

Func<Task> action = async () =>
{
    await Task.Delay(3000);
};

Console.WriteLine("start");
await Task.Run(action);
Console.WriteLine("end");
Func action=async()=>
{
等待任务。延迟(3000);
};
控制台写入线(“开始”);
等待任务。运行(操作);
控制台。写入线(“结束”);

不确定您在哪里测试,但第一个示例并没有等待延迟:@CamiloTerevinto抱歉,我编写了错误的代码。既然这是问题的副本,为什么应该这样做?顺便说一句:它不等待!我已经添加了。它不仅仅是副本。等待();在线#6,它对您有用,兄弟,请尝试一下不工作:)。因为您正在运行一个任务,所以它不会等待。我之前添加了一个关于您的方法的示例,阅读我的答案,您将看到为什么它不等待。@Kaj您提供的是Task.Delay(2000.wait();这和我说的完全不同,兄弟。我的代码100%工作,尽管你没有抓住要点。因为您正在运行一个任务,所以它不会等待!当我尝试它时,它不会等待。