我有一个现有的 WPF 应用程序,它有几个部分。每个部分都是一个用户控件,它实现了一个接口。
该接口指定了两种方法:void LoadData([...])
和bool UnloadData()
。
这些方法是由 UI 线程调用的,所以如果很耗时,我们需要在 backgroundworker 中完成我们的工作。
没有问题,LoadData
因为我们可以异步更新 UI。问题在于 UnloadData()。
如果我们真的可以离开当前视图,这应该会返回。
这是根据数据的当前状态计算的(已保存/已修改/无效):
- 保存返回真,
- 无效询问您是要留下来保存一些正确的数据还是离开而不保存
- 修改后告诉您可以取消更改(返回 true),继续编辑(返回 false),或者保存当前数据(返回 true)
问题在于“修改->保存”。这是一种耗时的方法,因此为了尊重应用程序的理念,我们应该在后台线程中运行它(带有繁忙指示器)。
但是如果我们只是启动线程并进入下一部分,它会返回“true”给方法调用,我们将直接启动下一个视图。
就我而言,在保存本地数据之前加载下一个视图可能是个问题。
所以:
有没有办法在返回“true”之前等待后台线程完成,而不阻塞 UI?
public bool UnloadData(){
if(...){
LaunchMyTimeConsumingMethodWithBackgroundWorker();
return true;//Only when my time consuming method ends
}
//[...]
}
重要编辑 也许我不够清楚:我知道如何使用 BackgroundWorker 或 TPL。我的问题是父类(调用 UnloadData() 的类是我无法编辑的类(由于多种原因:它位于另一个不会重新加载的 DLL 中,它已经与 70 多个 userControls 一起使用,全部分开项目(dll),通过反射加载。
这不是我的选择,我觉得不好,但我现在必须处理它。我主要是在寻找让我的方法等待我的方法返回的方法。我不确定这是否可能。但我正在寻找一种解决方法,它可以让我节省数周的工作时间。