对于异步运行代码(例如使用 async/await),我需要一个适当的任务。当然,框架中有几个预定义的方法,涵盖了最常见的操作,但有时我想编写自己的方法。我是 C# 的新手,所以很可能我做错了,但我至少对我目前的做法并不完全满意。请参阅以下示例了解我在做什么:
public async Task<bool> doHeavyWork()
{
var b1 = await this.Foo();
//var b2 = await Task<bool>.Factory.StartNew(Bar); //using Task.Run
var b2 = await Task.Run(()=>Bar());
return b1 & b2;
}
public Task<bool> Foo()
{
return Task.Factory.StartNew(() =>
{
//do a lot of work without awaiting
//any other Task
return false;
});
}
public bool Bar()
{
//do a lot of work without awaiting any other task
return false;
}
一般来说,我创建和使用像 Foo 示例这样的方法,但是有一个“额外”的 lambda 包含整个方法逻辑,看起来不太漂亮恕我直言。另一种选择是使用任何方法,如 Bar 示例,但我认为这更糟,因为不清楚该方法是否应该异步运行(除了正确的方法名称,如 BarAsync)并且 Task.Factory.StartNew 可能必须在程序中重复多次。我不知道如何告诉编译器“此方法返回一个任务,请在调用时将其作为一个整体包装到一个任务中”,这就是我想要做的。
最后我的问题是:编写这种方法的最佳方法是什么?我可以摆脱“额外”的 lambda(当然不添加额外的命名方法)吗?
编辑 正如 Servy 所说,拥有该方法的同步版本总是有充分的理由。只有在绝对必要时才应提供异步版本(Stephen Cleary 的链接)。