如果这个问题离题,您可以在评论中写下稍后将其删除:)
如果我有 3 层(*.DLL 的)
数据访问层.DLL
业务逻辑层.DLL
UI 应用程序(WPF、WinForms、任何技术)
在我的应用程序中,我让 BusinessLogicLayer 方法返回Task,在 UI 应用程序中,当我使用来自 BusinessLogicLayer 的方法时,我调用 await
我有以下误解:
Task 或并发应该支持哪一层(Back-End、Middle-were、Front)
如果我需要为其他开发人员制作可重用的 BusinessLogicLayer,他们也可能忘记在处理他们的下一个项目中使用 UI 应用程序层中的等待/异步方法。如何在中间层实现等待方法,无需在每个 UI 事件(例如 Button_Click)中编写等待。
如何使 DataAccessLayer 只包含并发和在 UI 层中等待,而不需要使用await、async关键字。
我的简单代码包含以下内容:
DataAccessLayer.DLL单一方法
public void MoveNext()
{
if (RecordCount == 0) return;
Tables[0].Query.Criteria.Clear();
Tables[0].Query.Sorting = $"ORDER BY {string.Join(" ASC, ",
Tables[0].Keys.Select(x => x.KeyID))} ASC";
FetchDataBuffer();
}
BusinessLogicLayer.DLL现在以简单的方式包装了数据访问的方法
public Task MoveNext() => Task.Run(() => { EntryBase.MoveNext(); });
UI 层(.NET 中的任何应用程序或前端提供程序)
private async void BtnNext_ItemClick(object sender, ClickEventArgs e)
{
await EntryLogic.MoveNext();
DeserializeBuffer();
}
如上所示,在并发方法 ( MoveNext ) 完成之前, DeserializeBuffer方法不会执行。
我需要做的是摆脱UI 层中的 await关键字和异步。
我实际上做的是失败,不知道为什么会这样
我尝试制作的场景如下:
将 DataAccessLayer 的方法类型从void转换为Task
public Task MoveNext()
{
return Task.Run(() => {
if (RecordCount == 0) return;
Tables[0].Query.Criteria.Clear();
Tables[0].Query.Sorting = $"ORDER BY {string.Join(" ASC, ",
Tables[0].Keys.Select(x => x.KeyID))} ASC";
FetchDataBuffer();
});
}
然后在中间层BusinessLogicLayer中调用await
公共异步无效 MoveNext() => 等待 EntryBase.MoveNext();
之后从逻辑层调用 UI 层中的 MoveNext。我想这会使它可以等待,因为它已经在中间层声明了等待。但实际上 UI 层同时执行下一个方法。所以抛出的异常是因为关闭下一个方法(DeserializeBuffer)取决于上一个方法(EntryLogic.MoveNext)
private async void BtnNext_ItemClick(object sender, ClickEventArgs e)
{
EntryLogic.MoveNext();
DeserializeBuffer(); // exception thrown
/* because EntryLogic.MoveNext
is still executing and not awaited */
}
任何帮助,将不胜感激。
qq_花开花谢_0
相关分类