1 回答

TA贡献1835条经验 获得超7个赞
我需要做的是摆脱 UI 层中的 await 关键字和异步。
这是完全错误的。UI 层是唯一必须async
使用的地方。而且它们确实必须在该层中使用。await
您的数据访问技术未指定,但从代码来看,我猜它可能是DataTable
基于 - 的,这是有问题的,因为DataTable
它非常旧并且不支持async
. 请注意,使用“使它们异步”包装方法主体Task.Run
是一种反模式- 这些实际上是伪异步方法,而不是真正的异步。
如果我错了并且您的数据访问技术确实支持async
,那么您应该能够在async
不使用Task.Run
. 从最低级别开始(例如,FetchDataBuffer
调用任何方法)并将它们更改为异步等效项。然后让async
从那里成长。请注意,“让异步增长”意味着使用async Task
,而不是async void
; async void
在 BLL 中绝对是一种反模式。
但是,如果我是对的并且您的 DAL 正在使用DataTable
,那么您需要决定是否切换到更新的数据访问技术。如果这不是您现在可以做的事情,那么我建议保留现有的 DAL 和 BLL 代码,并将async
/添加await
到 UI 层:
private async void BtnNext_ItemClick(object sender, ClickEventArgs e)
{
await Task.Run(() => EntryLogic.MoveNext());
DeserializeBuffer();
}
这不是反模式,因为我们使用Task.Run的是调用方法——将其移出 UI 线程。这并不理想,因为我们仍在使用比必要更多的线程,但理想的解决方案需要真正的异步数据访问。通过这种妥协,您的 DAL 和 BLL 仍然处于阻塞状态,因此它们在桌面 UI 应用程序之外的使用受到限制。
- 1 回答
- 0 关注
- 90 浏览
添加回答
举报