我可以不等待异步任务而不使其异步无效吗?

as7*_*s74 4 c# task-parallel-library async-await

使用异步任务方法时,需要在方法之前放置等待.我需要以非UI阻塞方式执行代码,并且不想等待.我唯一的想法是使用:

private void TaskFactory()
{ 
    CancellationTokenSource token_TaskFactory = new CancellationTokenSource();
    ParallelOptions parOpts = new ParallelOptions();
    parOpts.CancellationToken = token_TaskFactory.Token;
    parOpts.MaxDegreeOfParallelism = Environment.ProcessorCount;
    TaskCreationOptions atp = new TaskCreationOptions();     
    atp = TaskCreationOptions.PreferFairness;
    Task TaskFactory = Task.Factory.StartNew(() => 
    {
       if (!token_TaskFactory.IsCancellationRequested)     
       {
         Thread.Sleep(5000);
       }
       else
       {

       }
    }, token_TaskFactory.Token, atp, TaskScheduler.Default); 
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*ary 8

使用异步任务方法时,需要在方法之前放置等待.

处理此问题的正确方法是await使用方法,并调用方法async Taskasync Task<TResult>.这会在async您的代码中传递出级联效果.

在UI的应用程序,你通常会在一个事件处理程序,它结了不能async Task,在这一点上,你可以使事件处理程序async void.

如果您通过制作常规方法来欺骗此过程async void,则会导致其他问题,尤其是错误处理和可组合性(即单元测试).请参阅我的MSDN文章或关于为什么应该避免的许多讨论之一async void.

我需要以非UI阻塞方式执行代码,并且不想等待.

你为什么不"想"使用await?你有异步代码,你需要以非阻塞的方式运行,而这正是await它的作用!

  • 在这种情况下,您只需启动诸如`Task first = Task.Run(...); 任务第二个= Task.Run(...);`然后`等待`它们一次就像`await Task.WhenAll(first,second);` (7认同)
  • @BillGreer:我不理解你的问题.如果方法是异步的,它(通常)将不会阻塞.不使用await是一种"一劳永逸",你不关心*当*方法完成时,*结果*是什么,或者它是否引发了*异常*.所有这三个问题在一起几乎都不是真的; 你的代码通常至少关心其中一个. (2认同)