2014-02-18 5 views
5

Интересно, что произойдет, если я вызову метод, который помечен как async, не используя ожидание. Рассмотрим следующий пример:Что происходит при вызове метода async без ожидания?

private int id = 0; 
async Task Initialize() 
{ 
    var content = await LoadFromDisk(id); 
    await Process(content); 
    return; 
} 

DataId 
{ 
    get { return id; } 
    set { id = value; Initialize(); } 
} 

Я знаю, что это произведет предупреждение компиляции, но мой вопрос, если ожидаемый метод вызывает в Initialize() будет продолжать работать, как и следовало ожидать. Как вы можете видеть, нет необходимости, чтобы сеттер ожидал Initialize(), поскольку нет возвращаемого значения, и это последний вызов средства настройки свойства. Это своего рода огонь и забыть.

Причина, по которой я хотел бы сделать это, заключается в том, что я хотел бы объединить MVVM и базу данных, которая заставляет меня использовать методы async.

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

Я хотел бы привязать выбранную запись списка к DataId, которая обновляет подробное представление всякий раз, когда пользователь меняет выбор. Конечно, можно было бы сделать вызовы метода async из обработчика событий, но я хотел бы избежать обработчиков событий для более чистой реализации MVVM (используя в основном привязку данных).

+0

Я смущен, вы говорите о методах async без 'await', но ваш' Initialize() 'не' async', но содержит 'await', который не будет компилироваться. – svick

+0

Извините, просто забыли ключевое слово async. Я исправил это в сообщении. – SebastianR

ответ

12

Если вы вызываете метод async Task, не ожидая выполнения задачи, любые исключения из этого метода будут игнорироваться молча. Если вы вызываете метод async void (который вы указываете в заголовке вопроса, но ваш код равен , а не), то любые исключения из этого метода будут повторно подняты на SynchronizationContext - в этом случае отправляются непосредственно в основной интерфейс пользователя петля.

У меня есть сообщение в блоге asynchronous properties. В последнем разделе представлен NotifyTaskCompletion type, который был специально разработан для асинхронной привязки данных.

+0

Спасибо! Я думаю, что буду использовать 'NotifyTaskCompletion'! – SebastianR

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