完成"空"异步任务的不同方法

Bra*_*ner 5 c# async-await

我正在使用同时具有同步方法和async版本Reconcile方法的库.

这些方法需要2个IEnumerables和3个代表,这些代理根据第一个列表中的值从第二个列表中调用添加,修改或删除的项目.

我的代码目前正在使用同步版本,我想将其转换为使用该async版本.

由于我实际上并不需要做任何工作,在委托删除,我传递(item) => {}deletedAction参数.

我发现了几个不同的版本,如何将其转换为散布在互联网上的"空"异步代理,以及StackOverflow,但我不确定它们之间的区别,或者哪种方式最正确.

发送"空"异步委托作为参数的这些方法之间的区别是什么,以及哪些是当前"最正确"的方式?有没有更好的方法让我错过了?

  1. async (item) => {await Task.CompletedTask;}
  2. async (item) => {await Task.FromResult(0);}
  3. async (item) => {await Task.Yield;}
  4. async (item) => {await Task.Delay(0);} (这个似乎是一个糟糕的选择,但我将它包括在内是为了完整性)

它们似乎都在工作,除了Task.CompletedTask,但这是因为我使用的框架是.Net Framework的4.5版本,并且在该版本中不存在.

Ser*_*rvy 6

所以没有一个是正确的.你应该做的是:

item => Task.CompletedTask
Run Code Online (Sandbox Code Playgroud)

或者,在旧版本的框架上:

item => Task.FromResult(0)
Run Code Online (Sandbox Code Playgroud)

您没有理由让该方法async等待已完成的任务.它只是增加了状态机的开销,以便什么都不做.

Delay在返回完成的任务之前,使用只是通过一个额外的间接层.除了模糊你试图返回已完成的事实之外,它没有添加任何有用的东西Task.它还依赖于未记录的实现细节,该细节Delay在超时时返回已完成的任务0,这在可能的情况下应该避免.

使用Yield是迄今为止最糟糕的.整Yield是,它不会被观察到被马上完成.该目标Yield是导致持续添加和解雇,而不是被观察到被立即完成任务.它专门用于避免您想要利用的优化.