C# 我是否可以等待异步任务而不使其异步无效?

C# 我是否可以等待异步任务而不使其异步无效?,c#,task-parallel-library,async-await,C#,Task Parallel Library,Async Await,当使用异步任务方法时,需要将wait置于方法之前。我需要代码以非UI阻塞的方式执行,不想等待。我唯一的想法是使用: private void TaskFactory() { CancellationTokenSource token_TaskFactory = new CancellationTokenSource(); ParallelOptions parOpts = new ParallelOptions(); parOpts.CancellationToken

当使用异步任务方法时,需要将wait置于方法之前。我需要代码以非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); 
}
当使用异步任务方法时,需要将wait置于方法之前

正确的处理方法是
等待
方法,并使调用方法
异步任务
异步任务
。当
async
向上遍历代码时,这将产生级联效应

在UI应用程序中,您通常会遇到一个事件处理程序,它不能是
async Task
,此时您可以使事件处理程序
async void

如果通过使用常规方法
async void
来欺骗此过程,则会导致其他问题,尤其是在错误处理和可组合性(即单元测试)方面。请参阅或了解应避免使用
async void
的原因

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


您为什么不“想要”使用
wait
?您需要以非阻塞方式运行异步代码,
await
正是这样做的

如果您想使用fire+forget,那么,
async void
就可以了。你忘了放
async
修饰符。我忘了放async修饰符在哪里?在void TaskFactory()中,我不希望async不使用wait then。方法不会阻止UI。必须在方法声明中放入
async
,并且必须在方法中使用
await
,但不需要
await
方法本身。当我不等待方法本身时,我会收到警告:因为此调用未被等待,在调用完成之前,继续执行当前方法。考虑将“等待”操作符应用到调用的结果。我想防止这种警告。除非我不担心什么时候需要使用fire和forget方法。是的,这对于fire+forget是正常的。我不想使用wait,因为需要并行执行几个异步方法,而不需要等待一个。你的MSDN文章是无价的。谢谢Stephen。在这种情况下,您只需启动任务,如
Task first=Task.Run(…);任务秒=任务。运行(…)如果您不关心它是否阻塞了一点,但唯一可用的方法是异步,该怎么办?这似乎是一个完美的场景,您可以在不等待的情况下调用异步方法。@BillGreer:我不理解您的问题。如果该方法是异步的,它(通常)不会阻塞。不使用wait是一种“触发并忘记”的方法,您不关心方法何时完成、结果是什么,也不关心它是否抛出异常。所有这三个问题加在一起几乎都是不正确的;您的代码通常至少关心其中一个。