我有一个高吞吐量排队安排,我接受Func<Task>
并希望将其投影到Func<Task<System.Reactive.Unit>>
以很好地适应下游Rx系统。将任务转换为任务<Unit>的最有效方法?
由于Unit.Default
是唯一的价值,所以觉得这应该很容易,但我希望它尽可能高效。我希望以正确的方式通过原始Task
的所有例外。
我目前的做法是:
public Task<Unit> QueueTaskRx(Func<Task> task)
{
Func<Task<Unit>> f = async() =>
{
await task();
return Unit.Default;
};
return QueueTask(f);
}
,但我担心的async/await
也许是其他的开销,更有效的方法是:
public Task<Unit> QueueTaskRx(Func<Task> task)
{
Func<Task<Unit>> f =() => task().ContinueWith(_ =>
{
// What other cases do I need to consider here??
if (_.IsFaulted && _.Exception != null)
throw _.Exception.InnerException;
return Unit.Default;
}, TaskContinuationOptions.ExecuteSynchronously);
return QueueTask(f);
}
但是这并未”感觉安全和更复杂,分支等
有没有人有更好的方法?
*但我担心async/await的开销*为什么?你测试过这段代码,发现编译器生成的状态机结构是最重要的开销吗? –
@YuvalItzchakov谢谢 - 是的,我已经在一个紧密的循环中进行了测试,发现使用'async/await'和'ExecuteSynchronously'' ContinueWith'的速度慢了大约46%。 – jamespconnor
也许您可以与我们分享您的测量代码和性能结果。 –