this.Close() 没有杀死观察者 NewThreadScheduler.Default.Schedule 创建的线程
this.Close() not killing thread created by observer NewThreadScheduler.Default.Schedule
我是 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 window“消失了" 但应用程序本身永远不会关闭。我认为由 observable 创建的线程使应用程序保持活动状态。
所以,我的问题是:如何正确关闭应用程序并防止线程保持活动状态?
谢谢!
编辑
我正在使用 caliburn.micro 来实现 MVVM 模式。我正在我的一个 ViewModel 类 中进行订阅。我认为这不重要,但以防万一...
永远不要returnDisposable.Empty
。你被迫这样做是因为你的代码没有自然的一次性,因为你创建了一个无限循环。
摆脱无限循环,整个问题就迎刃而解了。
你可以简单地解决这个问题:
internal IObservable<string> DoBackgroundOperations(string param)
{
return
Observable
.Generate(
0,
x => true,
x => x + 1,
x => /* some operations that change the param */,
Scheduler.Default);
}
我特意选择了 Scheduler.Default
,因为 Scheduler.NewThread
已被弃用。
如果您提供了 // some operations that change the param
的代码,我可以给您工作代码。
现在,要干净地关闭您的应用程序,您应该处理您创建的所有订阅,但至少您不会再在无限循环中占用一个线程。
我是 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 window“消失了" 但应用程序本身永远不会关闭。我认为由 observable 创建的线程使应用程序保持活动状态。
所以,我的问题是:如何正确关闭应用程序并防止线程保持活动状态?
谢谢!
编辑
我正在使用 caliburn.micro 来实现 MVVM 模式。我正在我的一个 ViewModel 类 中进行订阅。我认为这不重要,但以防万一...
永远不要returnDisposable.Empty
。你被迫这样做是因为你的代码没有自然的一次性,因为你创建了一个无限循环。
摆脱无限循环,整个问题就迎刃而解了。
你可以简单地解决这个问题:
internal IObservable<string> DoBackgroundOperations(string param)
{
return
Observable
.Generate(
0,
x => true,
x => x + 1,
x => /* some operations that change the param */,
Scheduler.Default);
}
我特意选择了 Scheduler.Default
,因为 Scheduler.NewThread
已被弃用。
如果您提供了 // some operations that change the param
的代码,我可以给您工作代码。
现在,要干净地关闭您的应用程序,您应该处理您创建的所有订阅,但至少您不会再在无限循环中占用一个线程。