【发布时间】:2018-12-17 08:08:21
【问题描述】:
我是 C# 的新手,遇到以下问题:我有一个 WPF 应用程序,它执行一个无限任务,该任务执行一些非常昂贵的后台操作。这些操作有时会更改值,并且必须在 UI 中进行更新。这些操作需要在不同于 UI 线程的线程中运行,因为它们可能会锁定 UI。所以,我正在尝试使用 System.Reactive 库,它实际上工作得很好......但是,当我尝试使用执行 this.Close(); 方法的自定义关闭按钮来关闭应用程序时,应用程序不是关闭。
我的 observable 看起来像这样:
internal IObservable<string> DoBackgroundOperations(string param) {
return Observable.Create<string>(o => {
NewThreadScheduler.Default.Schedule(() => {
for (;;) {
param = // some operations that change the param
// when the param has been changed, I send the new value to the subscribers
o.OnNext(param);
}
});
return Disposable.Empty;
});
}
然后我订阅它并更改我需要在 UI 中更新的值:
sevice.DoBackgroundOperations(param).Subscribe(newVal => Data = newVal);
正如我之前所说,当更新值到来时我会收到更新的值并且它运行良好,但是当触发关闭按钮的单击事件时,UI 窗口“消失”但应用程序本身永远不会被关闭。我认为 observable 创建的线程使应用程序保持活力。
所以,我的问题是:如何正确关闭应用程序并防止线程保持活动状态?
谢谢!
编辑
我正在使用 caliburn.micro 来实现 MVVM 模式。我正在我的一个 ViewModel 类中进行订阅。我认为这并不重要,但以防万一......
【问题讨论】:
标签: c# multithreading system.reactive caliburn.micro