Asynt / ожидают в слое UI?или по другому?Да, его интерфейс - PullRequest
3 голосов
/ 14 марта 2019

Вопрос старый. Ответ async / await должен быть помещен в слой пользовательского интерфейса ниже

1 Ответ

4 голосов
/ 14 марта 2019

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

Это совершенно неправильно.Слой пользовательского интерфейса - единственное место, где должны использоваться async и await .И у них есть для использования на этом уровне.

Ваша технология доступа к данным не определена, но я думаю, что из кода она может быть DataTable, чтопроблематично, потому что DataTable очень старый и не поддерживает async.Обратите внимание, что тело метода обтекания с помощью Task.Run для "сделать их асинхронными" является антипаттерном - это на самом деле фальшиво-асинхронные методы , не совсем асинхронные.

ЕслиЯ не прав, и ваша технология доступа к данным поддерживает поддержку async, тогда вы сможете использовать методы DAL async без использования Task.Run.Начните с уровня наименьшего (например, какие бы методы ни вызывали FetchDataBuffer) и измените их на асинхронные эквиваленты.Тогда пусть async оттуда вырастет.Обратите внимание, что «позволить асинхронному росту» означает использование async Task, а не async void;async void в BLL определенно является антипаттерном .

Но если я прав и ваш DAL использует DataTable, то вам нужно решить, стоит ли переходить на более новые данныетехнология доступа.Если это не то, что вы можете сделать прямо сейчас, то я бы порекомендовал сохранить существующий код DAL и BLL и просто добавить async / await на слой пользовательского интерфейса:

private async void BtnNext_ItemClick(object sender, ClickEventArgs e)
{
  await Task.Run(() => EntryLogic.MoveNext());
  DeserializeBuffer();
}

Этоне антипаттерн, потому что мы используем Task.Run to , вызываем метод - чтобы удалить его из потока пользовательского интерфейса.Это не идеальный , поскольку мы все еще используем больше потоков, чем необходимо, но идеальное решение потребовало бы истинного асинхронного доступа к данным.При таком компромиссе ваши DAL и BLL по-прежнему блокируются, поэтому их использование за пределами приложений пользовательского интерфейса для настольных компьютеров ограничено.

...