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上工作,而不会发生更改。