编程语言
首页 > 编程语言> > c#-UI层中的Asynt / await?或不同?是的,它的UI

c#-UI层中的Asynt / await?或不同?是的,它的UI

作者:互联网

问题已经老了.异步/等待的答案必须放在下面的UI层中

解决方法:

What i need to make is get rid off await’s keywords and async in UI layer.

这是完全错误的. UI层是必须使用async和await的唯一地方.而且必须在该层中使用它们.

您的数据访问技术未指定,但是从代码中,我猜它可能是基于DataTable的,这是有问题的,因为DataTable太旧并且不支持异步.请注意,wrapping method bodies with Task.Run to “make them asynchronous” is an antipattern-实际上是fake-asynchronous methods,不是真正的异步.

如果我错了,并且您的数据访问技术确实支持异步,那么您应该能够使DAL方法异步,而无需使用Task.Run.从最低级别开始(例如FetchDataBuffer调用的任何方法),然后将其更改为异步等效项.然后让异步从那里成长.请注意,“让异步增长”意味着使用异步任务,而不是异步void. async void in the BLL is definitely an antipattern.

但是,如果我是对的,而您的DAL正在使用DataTable,那么您需要确定是否要切换到更新的数据访问技术.如果这不是您现在可以执行的操作,那么我建议保留现有的DAL和BLL代码,并仅向UI层添加async / await:

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

这不是反模式,因为我们使用Task.Run来调用方法-将其移出UI线程.这不是理想的,因为我们仍然使用了不必要的线程,但是理想的解决方案将需要真正的异步数据访问.通过这种妥协,您的DAL和BLL仍然处于阻塞状态,因此它们在桌面UI应用程序之外的使用受到限制.

标签:async-await,task,n-tier-architecture,c,net
来源: https://codeday.me/bug/20191024/1922941.html