C# 反应UI命令并发性(WebClient)

C# 反应UI命令并发性(WebClient),c#,.net,wpf,multithreading,reactiveui,C#,.net,Wpf,Multithreading,Reactiveui,我使用的是RXUI8的最新预发行版,但我认为这会发生在以前的版本中 我已在WPF应用程序中定义了此ReactiveCommand: GetWebsiteCommand = ReactiveCommand.CreateFromTask(DownloadString); private async Task<string> DownloadString() { using (var client = new WebClient()) { return a

我使用的是RXUI8的最新预发行版,但我认为这会发生在以前的版本中

我已在WPF应用程序中定义了此ReactiveCommand:

GetWebsiteCommand = ReactiveCommand.CreateFromTask(DownloadString);

private async Task<string> DownloadString()
{
    using (var client = new WebClient())
    {
        return await client.DownloadStringTaskAsync("http://www.google.es");
    }
}
GetWebsiteCommand=ReactiveCommand.CreateFromTask(下载字符串);
私有异步任务下载字符串()
{
使用(var client=new WebClient())
{
返回等待客户端。下载StringTaskAsync(“http://www.google.es");
}
}
执行该命令时,将引发以下异常:

System.Reactive.Core.dll上的System.InvalidOperationException: 调用线程无法访问此对象,因为存在其他线程 拥有它

为什么会这样?我没有创建任何新线程

这是堆栈跟踪:

System.Reactive.Core.dll上的System.InvalidOperationException: 调用线程无法访问此对象,因为存在其他线程 拥有它

at System.Windows.Threading.Dispatcher.VerifyAccess()
位于System.Windows.DependencyObject.GetValue(DependencyProperty dp)
在System.Windows.Controls.Primitives.ButtonBase.get_命令()中
在System.Windows.Controls.Primitives.ButtonBase.UpdateCanExecute()中
位于System.Windows.Controls.Primitives.ButtonBase.OnCanExecuteChanged(对象发送方,事件参数e)
位于System.Windows.Input.CanExecuteChangedEventManager.HandlerSink.OnCanExecuteChanged(对象发送方,事件参数e)
在ReactiveUI.ReactiveCommand.OnCanExecuteChanged()处
在ReactiveUI.ReactiveCommand`2.b_uu9_u5(布尔值)
at System.Reactive.AnonymousSafeObserver`1.OnNext(T值)
at System.Reactive.Linq.ObservableImpl.RefCount`1.\ OnNext(TSource值)
at系统。反应性。受试者。快速中期观察者'1。反应性(Int32计数)
at System.Reactive.Subjects.FastImmediateObserver`1.Reactive()
at System.Reactive.Subjects.ReplaySubject`1.ReplayBase.OnNext(T值)
at System.Reactive.Subjects.ReplaySubject`1.OnNext(T值)
在System.Reactive.Linq.ObservableImpl.Asobbservable`1.\uu.OnNext(t源值)
at System.Reactive.Linq.ObservableImpl.DistinctUntilChanged`2.\uu.OnNext(t源值)
在System.Reactive.Linq.ObservableImpl.CombineTest`3.\u.S.OnNext(t秒值)时
at System.Reactive.Linq.ObservableImpl.RefCount`1.\ OnNext(TSource值)
at系统。反应性。受试者。快速中期观察者'1。反应性(Int32计数)
at System.Reactive.Subjects.FastImmediateObserver`1.Reactive()
at System.Reactive.Subjects.ReplaySubject`1.ReplayBase.OnNext(T值)
at System.Reactive.Subjects.ReplaySubject`1.OnNext(T值)
在System.Reactive.Linq.ObservableImpl.Asobbservable`1.\uu.OnNext(t源值)
at System.Reactive.Linq.ObservableImpl.DistinctUntilChanged`2.\uu.OnNext(t源值)
在System.Reactive.Linq.ObservableImpl.Concat`1.\ OnNext(t源值)
在System.Reactive.Linq.ObservableImpl.中,选择'2.\ OnNext(t源值)
at System.Reactive.SafeObserver`1.OnNext(t源值)
在System.Responsive.ScheduledObserver`1.调度(ICancelable cancel)
at System.Reactive.Concurrency.Scheduler.c.b_u72_u0(操作'1A,ICANCellable c)
在System.Responsive.Concurrency.DefaultScheduler.LongRunning.c__DisplayClass1_0`1.b__0(对象参数)
在System.Responsive.Concurrency.ConcurrencyAbstrationLayerImpl.c__DisplayClass7_0.b__0()
位于System.Threading.ThreadHelper.ThreadStart\u上下文(对象状态)
位于System.Threading.ExecutionContext.RunInternal(ExecutionContext ExecutionContext、ContextCallback回调、对象状态、布尔值preserveSyncCtx)
在System.Threading.ExecutionContext.Run(ExecutionContext ExecutionContext,ContextCallback回调,对象状态,布尔保存SyncCTX)
在System.Threading.ExecutionContext.Run(ExecutionContext ExecutionContext,ContextCallback回调,对象状态)
位于System.Threading.ThreadHelper.ThreadStart()处

根据堆栈跟踪判断,您正在将
canExecute
管道传递到命令中。对于您提供的任何管道,您都有责任确保它位于正确的螺纹上。如果它在后台线程上打勾,则命令
CanExecute
事件将在同一线程上打勾,因此UI将尝试从错误的线程更新关联的
按钮上的
IsEnabled
属性

因此,您可能需要针对
canExecute
管道添加
ObserveOn
调用


更新:已回答。

您没有创建任何新线程吗?也许你不熟悉任务的概念。读information@CamiloTerevinto. 不,我没有创建任何新线程。我在哪里创建线程?据我所知,任务不涉及任何线程的创建。您知道WebClient.DownloadStringTaskAsync方法是否在其他线程上运行任务吗?@Camiloteriento您能告诉我task.FromResult(()=>1)是否在新线程上运行吗?请不要无缘无故地否决投票,开始给出有用的答案。否则,让其他人来做。@SuperJMN是否有异常的堆栈跟踪?我怀疑命令执行的结果是其他原因触发了这一点。被动命令将保证通过
RxApp.MainThreadScheduler
发送输出,所以我猜这里还发生了其他事情…@me--请检查操作。我已经添加了堆栈跟踪。谢谢你,肯特!但我不会通过任何CanExecute管道。命令是通过行
ReactiveCommand.CreateFromTask(DownloadString)创建的所以我只传递任务。你能运行代码吗?通过这些简单的线条,你将能够重现问题。
 at System.Windows.Threading.Dispatcher.VerifyAccess()
   at System.Windows.DependencyObject.GetValue(DependencyProperty dp)
   at System.Windows.Controls.Primitives.ButtonBase.get_Command()
   at System.Windows.Controls.Primitives.ButtonBase.UpdateCanExecute()
   at System.Windows.Controls.Primitives.ButtonBase.OnCanExecuteChanged(Object sender, EventArgs e)
   at System.Windows.Input.CanExecuteChangedEventManager.HandlerSink.OnCanExecuteChanged(Object sender, EventArgs e)
   at ReactiveUI.ReactiveCommand.OnCanExecuteChanged()
   at ReactiveUI.ReactiveCommand`2.<.ctor>b__9_5(Boolean _)
   at System.Reactive.AnonymousSafeObserver`1.OnNext(T value)
   at System.Reactive.Linq.ObservableImpl.RefCount`1._.OnNext(TSource value)
   at System.Reactive.Subjects.FastImmediateObserver`1.EnsureActive(Int32 count)
   at System.Reactive.Subjects.FastImmediateObserver`1.EnsureActive()
   at System.Reactive.Subjects.ReplaySubject`1.ReplayBase.OnNext(T value)
   at System.Reactive.Subjects.ReplaySubject`1.OnNext(T value)
   at System.Reactive.Linq.ObservableImpl.AsObservable`1._.OnNext(TSource value)
   at System.Reactive.Linq.ObservableImpl.DistinctUntilChanged`2._.OnNext(TSource value)
   at System.Reactive.Linq.ObservableImpl.CombineLatest`3._.S.OnNext(TSecond value)
   at System.Reactive.Linq.ObservableImpl.RefCount`1._.OnNext(TSource value)
   at System.Reactive.Subjects.FastImmediateObserver`1.EnsureActive(Int32 count)
   at System.Reactive.Subjects.FastImmediateObserver`1.EnsureActive()
   at System.Reactive.Subjects.ReplaySubject`1.ReplayBase.OnNext(T value)
   at System.Reactive.Subjects.ReplaySubject`1.OnNext(T value)
   at System.Reactive.Linq.ObservableImpl.AsObservable`1._.OnNext(TSource value)
   at System.Reactive.Linq.ObservableImpl.DistinctUntilChanged`2._.OnNext(TSource value)
   at System.Reactive.Linq.ObservableImpl.Concat`1._.OnNext(TSource value)
   at System.Reactive.Linq.ObservableImpl.Select`2._.OnNext(TSource value)
   at System.Reactive.SafeObserver`1.OnNext(TSource value)
   at System.Reactive.ScheduledObserver`1.Dispatch(ICancelable cancel)
   at System.Reactive.Concurrency.Scheduler.<>c.<ScheduleLongRunning>b__72_0(Action`1 a, ICancelable c)
   at System.Reactive.Concurrency.DefaultScheduler.LongRunning.<>c__DisplayClass1_0`1.<ScheduleLongRunning>b__0(Object arg)
   at System.Reactive.Concurrency.ConcurrencyAbstractionLayerImpl.<>c__DisplayClass7_0.<StartThread>b__0()
   at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart()