我问自己以下两种解决方案中的哪一种更好?
我对方法有一些重载,因为参数可能是可选的。
版本1:返回任务而不等待
public class MyClass
{
public async Task MyTask(int i, int j, int k)
{
try
{
await MyStaticClass.MyAsyncWorkIHaveToDo(i, j, k);
}
catch (Exception ex)
{
// Handle exception
}
}
public Task MyTask(int i, int j)
{
int k = 0;
return MyTask(i, j, k);
}
public Task MyTask(int i)
{
int j = 1;
return MyTask(i, j);
}
}
版本2:等待每种方法:
public class MyClass2
{
public async Task MyTask(int i, int j, int k)
{
try
{
await MyStaticClass.MyAsyncWorkIHaveToDo(i, j, k);
}
catch (Exception ex)
{
// Handle exception
}
}
public async Task MyTaskAsync(int i, int j)
{
int k = 0;
await MyTask(i, j, k);
}
public async Task MyTaskAsync(int i)
{
int j = 1;
await MyTaskAsync(i, j);
}
}
版本2在IL级别生成多个(3)状态机。版本1只生成一个。所以我认为从性能的角度来看,版本1更好,但可能存在一些我没有想到的陷阱。
是否有一些最佳实践可以遵循?
答案 0 :(得分:4)
转到第一版。正如您所说,它使用较少的状态机。 如果您对任务的结果执行某些操作或想要处理任何异常,则只需要等待。
修改强>
您编辑了问题以在方法中包含异常处理。这当然很好,它表明在这种情况下你必须await
结果。
注意强>
我看到你正在使用静态类。确保没有发生并发问题!你在那里有共享国家吗?
进一步阅读
可以找到更多背景阅读here
从该博文中,当直接返回Task
时,关注点是:
using
声明AsyncLocal