c # Написание асинхронного метода, в котором нет ожидающего - PullRequest
0 голосов
/ 03 января 2019

Я хочу, чтобы в моем вызове был метод async, который будет вызываться потребителями моей библиотеки с await.Но внутренняя работа моего метода, хотя он мне нужен для запуска в отдельном потоке, не вызывает никаких других await самостоятельно.

Я просто выполняю работу, которую должен делать метод, и возвращаютип.И компилятор предупреждает меня, что этот метод не будет работать асинхронно.

public async Task<MyResultObject> DoSomeWork()
{
     MyResultObject result = new MyResultObject();
     // Some work to be done here

     return result;
}

С другой стороны, если я напишу метод, который запускает новую задачу с помощью TaskFactory, например:

public Task<MyResultObject> DoSomeWork()
{
     return Task<MyResultObject>.Factory.StartNew(() =>
     {
         MyResultObject result = new MyResultObject();
         // Some work to be done here

         return result;
     });
}

Тогда я не могу вызвать его с помощью ключевого слова await, например: await DoSomeWork().

Как написать async (должен быть асинхронным, а не задачей с результатом или ожиданием) без использования некоторыхawait позвонить внутрь?

1 Ответ

0 голосов
/ 04 января 2019

Вы можете сделать это

public Task<MyResultObject> DoSomeWork()
{
     MyResultObject result = new MyResultObject();
     // Some work to be done here

     return Task.FromResult(result);
}

, что точно так же, как

public async Task<MyResultObject> DoSomeWork()
{
     MyResultObject result = new MyResultObject();
     // Some work to be done here

     return result;
}

Только эта версия выдает предупреждение и имеет немного больше накладных расходов.

Но ни один из них не будет работать в другом потоке. Единственное преимущество заключается в том, что они имеют ожидаемый интерфейс.

Чтобы сделать это параллельно, ваш код в порядке, но Task.Run предпочтительнее, чем StartNew ():

public Task<MyResultObject> DoSomeWork()
{
     return Task.Run(() =>
     {
         MyResultObject result = new MyResultObject();
         // Some work to be done here

         return result;
     });
}

И во всех этих случаях вы определенно можете await DoSomeWork()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...