2015-09-23 3 views
0

У меня есть приложение Windows Store с приложением streamsocket, выполняющимся в задаче, ожидающей появления команд по сети. Мне нужно убедиться, что каждая команда полностью обработана, прежде чем делать следующую.Использование async для обработки команд по порядку, без ожидающего предупреждения

Слушатель принимает необработанное сообщение и делает

await ProcessMessage(message); 

которого

private async Task ProcessMessage(string message, string optionalFlags = "") 

который анализирует сообщение и вызывает один из многих методов, т.е.

ProcessCommandXYZ(parameters); 

Это кажется работа, но в async-задаче ProcessMessage я получаю CS1998 «асинхронный метод не хватает« ждут », предупреждение, nd search говорит, что если вы получите это сообщение, вы, вероятно, неправильно используете async.

Является ли мой подход правильным и могу ли я игнорировать это предупреждение или есть лучший способ сделать это?

Update

Я понимаю, что многие мои проблемы является одним из методов обновления состояния, который связан с ListView, так что в диспетчеру UI и позволяет выйти из синхронизации и Я ожидал, что это ProcessCommandABC(). Поскольку это всего лишь один метод, я считаю, что могу оптимизировать, если это лучше, и не дождаться одного метода?

ответ

2

Целью использования async является то, что вы можете использовать ключевое слово await в этой функции/методе. Поскольку метод ProcessMessage не делает никаких ожиданий внутри него, компилятор дает вам это предупреждение. Решение прост: удалите async от ProcessMessage. Использование await вызывающим абонентом не требует, чтобы вызываемый метод был объявлен async. Метод просто должен вернуть Task или Task<T>.

2

Как упоминалось @Mayoor, недостаток awaits в ProcessMessage предполагает, что он выполняет синхронную работу, и в этом случае он не должен быть async. Объявление метода как async не делает его асинхронным, оно просто позволяет вам использовать await, чтобы ждать завершения асинхронной работы.

Если работа синхронна, вы можете запустить ее в фоновом режиме, используя Task.Run, который вы можете await. Таким образом, один из возможных решений, чтобы сделать ваш метод ProcessMessage синхронными, а затем просто позвонить

await Task.Run(() => ProcessMessage(...)); 

Вы можете узнать больше о async-await лучших практиков в этой article.

+0

Возможно, я задаю неправильный вопрос, я обновил основную запись - настоящая проблема - диспетчер, вызывающий команды выходить из строя – Jason

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