Что мне нужно сделать, так это избавиться от ключевых слов 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 по-прежнему блокируются, поэтому их использование за пределами приложений пользовательского интерфейса для настольных компьютеров ограничено.