Asynt/await 在 UI 层?还是不同?是的 UI
Asynt/await in UI layer ? or in different? Yes its UI
问题是旧的。 async/await的答案必须放在UI层下面
What i need to make is get rid off await's keywords and async in UI layer.
这是完全错误的。 UI层是唯一必须使用async
和await
的地方。他们 有 用于该层。
您的数据访问技术未指定,但从代码来看,我猜测它可能是基于 DataTable
的,这是有问题的,因为 DataTable
非常旧并且不支持 async
。注意wrapping method bodies with Task.Run
to "make them asynchronous" is an antipattern - those are actually fake-asynchronous methods,不是真正的异步。
如果我错了并且你的数据访问技术确实支持async
,那么你应该能够使你的DAL方法async
不使用 Task.Run
。从 最低 级别开始(例如,任何方法 FetchDataBuffer
调用)并将它们更改为异步等价物。然后让 async
从那里成长。注意"letting async grow"表示使用async Task
,不是async void
; async void
in the BLL is definitely an antipattern.
但是如果我是对的并且您的 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 应用程序之外的使用受到限制。
问题是旧的。 async/await的答案必须放在UI层下面
What i need to make is get rid off await's keywords and async in UI layer.
这是完全错误的。 UI层是唯一必须使用async
和await
的地方。他们 有 用于该层。
您的数据访问技术未指定,但从代码来看,我猜测它可能是基于 DataTable
的,这是有问题的,因为 DataTable
非常旧并且不支持 async
。注意wrapping method bodies with Task.Run
to "make them asynchronous" is an antipattern - those are actually fake-asynchronous methods,不是真正的异步。
如果我错了并且你的数据访问技术确实支持async
,那么你应该能够使你的DAL方法async
不使用 Task.Run
。从 最低 级别开始(例如,任何方法 FetchDataBuffer
调用)并将它们更改为异步等价物。然后让 async
从那里成长。注意"letting async grow"表示使用async Task
,不是async void
; async void
in the BLL is definitely an antipattern.
但是如果我是对的并且您的 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 应用程序之外的使用受到限制。