Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# this.Close()未终止由observer NewThreadScheduler.Default.Schedule创建的线程_C#_Multithreading_System.reactive_Caliburn.micro - Fatal编程技术网

C# this.Close()未终止由observer NewThreadScheduler.Default.Schedule创建的线程

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

我是C语言的新手,我遇到了以下问题:我有一个WPF应用程序,它执行一个无限任务,执行一些非常昂贵的后台操作。这些操作有时会更改值,并且必须在UI中进行更新。这些操作需要在不同于UI线程的线程中运行,因为它们可能会锁定UI。所以,我正在尝试使用这个系统。反应库,它实际上运行得很好。。。但是,当我试图使用执行this.close命令的自定义关闭按钮关闭应用程序时;方法,应用程序未关闭

我的可观测数据如下所示:

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);
}