Правильный способ возврата задачи в C # - PullRequest
0 голосов
/ 12 июня 2019

У меня есть сценарий, в котором мне нужно вернуть метод, который можно ожидать от вызывающей стороны.

У меня есть здесь мои реализации, и я просто хочу знать, какая из них является правильной.

Метод 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 ]

4 голосов
/ 12 июня 2019

Если вы спрашиваете , следует ли мне предоставить свойство или метод , то это полностью зависит от того, что представляет Task.

Если задание выполняется для экземпляра класса один раз, тогда целесообразно иметь свойство Task. Обычно в этом случае свойство представляет что-то об экземпляре, например «моя инициализация завершена» или «Я закончил обработку» .

Если задание нужно выполнить несколько раз, то целесообразно использовать метод возврата Task.

Task - методы возврата гораздо более распространены, чем Task свойства.

На заметке: Избегайте async void и Не используйте Task.Run без необходимости .

0 голосов
/ 12 июня 2019

Вам не нужно использовать 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();
   }
}
0 голосов
/ 12 июня 2019

Правильный код будет выглядеть так:

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();
   }
}
...