我正在使用同时具有同步方法和async版本Reconcile方法的库.
这些方法需要2个IEnumerables和3个代表,这些代理根据第一个列表中的值从第二个列表中调用添加,修改或删除的项目.
我的代码目前正在使用同步版本,我想将其转换为使用该async版本.
由于我实际上并不需要做任何工作,在委托删除,我传递(item) => {}的deletedAction参数.
我发现了几个不同的版本,如何将其转换为散布在互联网上的"空"异步代理,以及StackOverflow,但我不确定它们之间的区别,或者哪种方式最正确.
发送"空"异步委托作为参数的这些方法之间的区别是什么,以及哪些是当前"最正确"的方式?有没有更好的方法让我错过了?
async (item) => {await Task.CompletedTask;}async (item) => {await Task.FromResult(0);}async (item) => {await Task.Yield;}async (item) => {await Task.Delay(0);} (这个似乎是一个糟糕的选择,但我将它包括在内是为了完整性)它们似乎都在工作,除了Task.CompletedTask,但这是因为我使用的框架是.Net Framework的4.5版本,并且在该版本中不存在.
所以没有一个是正确的.你应该做的是:
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是导致持续添加和解雇,而不是被观察到被立即完成任务.它专门用于避免您想要利用的优化.