4

使用异步任务方法时,需要在方法之前放置等待。我需要以非 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); 
}
4

1 回答 1

8

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

处理这个问题的正确方法是await方法,并使调用方法async Taskasync Task<TResult>. 这将在async您的代码中向上传播时产生级联效应。

在 UI 应用程序中,您通常会在一个事件处理程序处结束,这不可能async Task,此时您可以创建事件处理程序async void

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

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

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

于 2013-07-19T10:55:15.330 回答