C# this.Close()未终止由observer NewThreadScheduler.Default.Schedule创建的线程
我是C语言的新手,我遇到了以下问题:我有一个WPF应用程序,它执行一个无限任务,执行一些非常昂贵的后台操作。这些操作有时会更改值,并且必须在UI中进行更新。这些操作需要在不同于UI线程的线程中运行,因为它们可能会锁定UI。所以,我正在尝试使用这个系统。反应库,它实际上运行得很好。。。但是,当我试图使用执行this.close命令的自定义关闭按钮关闭应用程序时;方法,应用程序未关闭 我的可观测数据如下所示:C# this.Close()未终止由observer NewThreadScheduler.Default.Schedule创建的线程,c#,multithreading,system.reactive,caliburn.micro,C#,Multithreading,System.reactive,Caliburn.micro,我是C语言的新手,我遇到了以下问题:我有一个WPF应用程序,它执行一个无限任务,执行一些非常昂贵的后台操作。这些操作有时会更改值,并且必须在UI中进行更新。这些操作需要在不同于UI线程的线程中运行,因为它们可能会锁定UI。所以,我正在尝试使用这个系统。反应库,它实际上运行得很好。。。但是,当我试图使用执行this.close命令的自定义关闭按钮关闭应用程序时;方法,应用程序未关闭 我的可观测数据如下所示: internal IObservable<string> DoBackgrou
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窗口会消失,但应用程序本身永远不会被关闭。我认为observable创建的线程保持了应用程序的活力
所以,我的问题是:我如何才能正确地关闭应用程序,并防止线程使其保持活动状态
谢谢
编辑
我使用caliburn.micro实现MVVM模式。我正在我的一个ViewModel类中进行订阅。我认为这不重要,但以防万一…永远不要返回一次性的。空的。你被迫这样做,因为你的代码没有一个自然的可丢弃的循环,因为你创建了一个无限循环
摆脱无限循环,你就能解决整个问题
您可以通过以下方法简单地解决此问题:
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已被弃用
如果您提供了//一些更改参数的操作的代码,我可以为您提供工作代码
现在,要完全关闭你的应用程序,你应该处理你创建的所有订阅,但至少你不再在无限循环中占用线程。谢谢你的回答!操作实际上是读取和分析文件系统中的一些文件。根据这些文件的内容,观察者可以将新参数发送到ViewModel,以便更新UI;o、 onNextnewParam;。可观察。生成功能非常强大。这是一个学习和使用,而不是观察。创造在可能的地方。
internal IObservable<string> DoBackgroundOperations(string param)
{
return
Observable
.Generate(
0,
x => true,
x => x + 1,
x => /* some operations that change the param */,
Scheduler.Default);
}