2015-06-24 1 views
1

Предположим, вы разрабатываете api и хотите предложить асинхронные методы, но есть вероятность, что пользователь фактически не хочет «ждать» для того, чтобы какой-либо конкретный метод асинхронизации завершился, прежде чем перейти к следующей строке; есть ли способ сделать его «огнем и забыть»? То есть сделайте так, чтобы метод фактически выполнялся асинхронно через Задачу и продолжал ли она следующую строку без ожидания? Таким образом, если пользователь хочет его ждать, то они могут, а те, которые хотят просто запустить его как задачу, могут это сделать.Объявление асинхронного метода, который может быть как ожидаемым *, так и * запускать асинхронно, не дожидаясь его завершения?

+5

Все они работают таким образом из коробки. Пользователь никогда не должен ждать чего-либо. И если вы хотите, чтобы он был огнем и забыл, сделайте возвращаемый тип 'void'. Но если вы вернете «Задачу», пользователю нужно ждать ее или нет. Вам не нужно делать ничего особенного для поддержки обоих случаев. – sstan

ответ

3

(Moving мой комментарий к ответу, потому что я предполагаю, что это такое)

Все методы работают асинхронные, что выход из коробки. Пользователь никогда не должен ждать чего-либо. Это зависит от пользователя, который ждет ваш метод async или нет. Вам не нужно делать ничего особенного для поддержки обоих случаев.

Пример:

public async Task MyAsyncMethod() { 
    // do something asynchronous in here... 
} 

Вы можете вызвать метод с await:

await obj.MyAsyncMethod(); 

... или нет ...

obj.MyAsyncMethod(); 

В этом последнем случае, метод будет огнем и забыть.

Пользователь также может выбрать сделать следующее с вашим методом:

Task t = obj.MyAsyncMethod(); 

// perform some other tasks that don't depend on the completion of "MyAsyncMethod" 

await t; // now I want to await on the task before continuing. 

// perform more tasks that require the completion of "MyAsyncMethod" 

И как вы можете видеть, мне не нужно делать какие-либо изменения в мой метод асинхронной поддерживать все 3 случая.

+1

+1 но я бы не рекомендовал делать код 'void'. Методы 'void'' async' были * специально созданы для одного, узкого, использования - обработчиков событий. Если вы найдете их где-нибудь еще, это, как правило, ошибка. См. [Избегайте асинхронных методов] (http://stackoverflow.com/help/formatting) и связанной с ним статьи, связанной с ней –

+0

@Damien: Вы правы, вероятно, лучше не упоминать эту опцию в этом контексте. Благодарю. Редактирование этого. – sstan

+0

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

3

Вы должны понимать, что await не выполняет метод. await только регистрирует продолжение оставшейся функции в объекте Task, который возвращается функцией. (фактически в Awaiter объекта Task).

Таким образом, функция выполняет, независимо от того, как и как вы дождались ее завершения. Вы можете сохранить объект Task и await позже. Или вы ждете его блокировки с помощью функции Task.Wait.

+0

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

+0

Это не совсем правильно. То, что находится в методе, выполняется синхронно в любом случае до первого 'ожидания 'внутри метода. Первый «ожидание» метода приведет к тому, что функция вернет объект «Задача». – Nitram

+0

Правильно, он будет работать синхронно независимо, но мне было интересно, есть ли альтернатива, где мы могли бы «упаковать» всю задачу async в качестве реальной задачи, которая может выполняться асинхронно полностью. – Anthony

Смежные вопросы