在处理重载时使用await?

时间:2018-02-23 08:02:37

标签: c# async-await

我问自己以下两种解决方案中的哪一种更好?

我对方法有一些重载,因为参数可能是可选的。

版本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更好,但可能存在一些我没有想到的陷阱。

是否有一些最佳实践可以遵循?

1 个答案:

答案 0 :(得分:4)

转到第一版。正如您所说,它使用较少的状态机。 如果您对任务的结果执行某些操作或想要处理任何异常,则只需要等待。

修改

您编辑了问题以在方法中包含异常处理。这当然很好,它表明在这种情况下你必须await结果。

注意

我看到你正在使用静态类。确保没有发生并发问题!你在那里有共享国家吗?

进一步阅读

可以找到更多背景阅读here

从该博文中,当直接返回Task时,关注点是:

  • 异常处理
  • 使用using声明
  • 使用AsyncLocal