在C#中返回任务的正确方法

时间:2019-06-12 13:41:18

标签: c# asynchronous async-await

我有一个场景,我需要返回一个可以从调用者那里等待的方法。

我在这里有自己的实现,我只想知道哪个是正确的。

方法1。

public class ClassA
{
    public Task MyTask { get; set; }
    public ClassA()
    {
       MyTask = MyAsyncMethod();
    }

    private async void MyAsyncMethod()
    {
       await LongProcessHere();
    }
}

public class MyCaller()
{
   private async void ExecuteAsync()
   {
      ClassA ca = new ClassA();
      await ca.MyTask;
   }
}

方法2。

public class ClassA
{
    public Task MyAsyncMethod()
    {
       return Task.Run(async()=>
       {
          await LongProcessHere();
       });
    }
}

public class MyCaller()
{
   private async void ExecuteAsync()
   {
      ClassA ca = new ClassA();
      await ca.MyAsyncMethod();
   }
}

3 个答案:

答案 0 :(得分:4)

如果您要询问我应该公开一个属性或方法,那么那完全取决于Task表示什么。

如果任务是对类的每个实例完成一次,则具有Task属性是合适的。通常,在这种情况下,属性表示有关实例的内容,例如"my initialization is complete""I am done processing"

如果任务是您需要多次执行的任务,那么使用Task返回方法是合适的。

Task返回方法比Task属性更常见。

在旁注中,avoid async voiddon't use Task.Run unnecessarily

答案 1 :(得分:0)

正确的代码如下:

public class ClassA
{
    // always return a Task from an async method 
    public async Task MyAsyncMethod()
    {
        await LongProcessHere();
    }
}

public class MyCaller
{
   private async Task ExecuteAsync()
   {
      ClassA ca = new ClassA();
      await ca.MyAsyncMethod();
   }
}

答案 2 :(得分:-1)

您不需要使用Task.Run来调用异步方法。异步方法也应该具有Task返回类型,而不是void。反之亦然。

public class ClassA
{
    public async Task MyAsyncMethod()
    {
       return await LongProcessHere();
    }
}

public class MyCaller()
{
   private async Task ExecuteAsync()
   {
      ClassA ca = new ClassA();
      await ca.MyAsyncMethod();
   }
}