Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.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# 反应线程异常:调用线程必须是STA,因为许多UI组件都需要它_C#_Wpf_System.reactive_Reactiveui - Fatal编程技术网

C# 反应线程异常:调用线程必须是STA,因为许多UI组件都需要它

C# 反应线程异常:调用线程必须是STA,因为许多UI组件都需要它,c#,wpf,system.reactive,reactiveui,C#,Wpf,System.reactive,Reactiveui,我正在使用以下代码 public IObservable<Unit> RunReport() { return Observable.Start(() => { string selectedPath = null; //System.Windows.Application.Current.Dispatcher.Invoke(delegate //{

我正在使用以下代码

    public IObservable<Unit> RunReport()
    {
        return Observable.Start(() =>
        {
            string selectedPath = null;

            //System.Windows.Application.Current.Dispatcher.Invoke(delegate
            //{
                OpenFileDialog ofd = new OpenFileDialog();

                if (ofd.ShowDialog() == DialogResult.OK)
                {
                    selectedPath = ofd.FileName;
                }
                else
                {
                    selectedPath = null;
                }
            //});
        });
    }
public IObservable RunReport()
{
返回可观察的。开始(()=>
{
字符串selectedPath=null;
//System.Windows.Application.Current.Dispatcher.Invoke(委托
//{
OpenFileDialog ofd=新建OpenFileDialog();
if(ofd.ShowDialog()==DialogResult.OK)
{
selectedPath=ofd.FileName;
}
其他的
{
selectedPath=null;
}
//});
});
}
它抛出一个
调用线程必须是STA,因为许多UI组件都需要这个
异常

如果我取消对上面3行的注释,那么我不会得到异常,但这并不是解决此问题的正确方法,因为我看到的许多关于可观察性和线程问题的其他答案都建议使用
Observable.Start(()=>…).ObserveOnDispatcher()


我尝试过这个选项,但错误依然存在

这段代码的意义是什么?这不是在观察任何事件。修复方法是使用在UI线程上运行的调度程序(例如DispatcherScheduler.Instance)。这就是ObserveOnDispatcher()为观察者所做的。但在本例中,
Start()
处理可观察/发布者。你可以做同样的事情,虽然只是通过删除可观察的。谢谢你的快速回复!我只提供了我的问题的一个最小的例子。
Observable
函数用于创建自定义的
ReactiveCommand
,其实现要求代码包含在
Obervable.Start(…)
中。代码驻留在ViewModel中(我实际上使用了一个服务来生成
OpenFileDialog
)。我已经尝试了
ObserveOnDispatcher
,但是异常并没有消失!这里没有观察者,因此
ObserveOnDispatcher
没有效果。该对话框由开始的可观察事件显示。您需要将计划程序添加到
Start
,即
Start(…,DispatcherScheduler.Instance)
。不过,该对话框本质上是一个视图,而不是应该由CommandOk显式显示的东西。行得通,谢谢。因此,如果我的命令要求用户选择一个文件,我如何在没有命令显式显示的情况下进行选择(我的生产代码使用
IDialogService
)。另外,我显然仍然不是100%支持观察者/调度员,我想你不能推荐任何好的资源吗?再次感谢:0)RxApp.MainThreadScheduler通常更好,因为它具有平台意识。例如,小时视图模型将在xamarin表单的wpf上工作而不做任何更改。这段代码的目的是什么?这不是在观察任何事件。修复方法是使用在UI线程上运行的调度程序(例如DispatcherScheduler.Instance)。这就是ObserveOnDispatcher()为观察者所做的。但在本例中,
Start()
处理可观察/发布者。你可以做同样的事情,虽然只是通过删除可观察的。谢谢你的快速回复!我只提供了我的问题的一个最小的例子。
Observable
函数用于创建自定义的
ReactiveCommand
,其实现要求代码包含在
Obervable.Start(…)
中。代码驻留在ViewModel中(我实际上使用了一个服务来生成
OpenFileDialog
)。我已经尝试了
ObserveOnDispatcher
,但是异常并没有消失!这里没有观察者,因此
ObserveOnDispatcher
没有效果。该对话框由开始的可观察事件显示。您需要将计划程序添加到
Start
,即
Start(…,DispatcherScheduler.Instance)
。不过,该对话框本质上是一个视图,而不是应该由CommandOk显式显示的东西。行得通,谢谢。因此,如果我的命令要求用户选择一个文件,我如何在没有命令显式显示的情况下进行选择(我的生产代码使用
IDialogService
)。另外,我显然仍然不是100%支持观察者/调度员,我想你不能推荐任何好的资源吗?再次感谢:0)RxApp.MainThreadScheduler通常更好,因为它具有平台意识。例如,小时视图模型将在xamarin表单的wpf上工作,而不会发生更改。