我正在使用RxUI 8的最新版本,但我认为这会发生在以前的版本中。ReactiveUI命令并发(WebClient)
我在我的WPF应用程序中定义该ReactiveCommand:
GetWebsiteCommand = ReactiveCommand.CreateFromTask(DownloadString);
private async Task<string> DownloadString()
{
using (var client = new WebClient())
{
return await client.DownloadStringTaskAsync("http://www.google.es");
}
}
当执行命令,下面的异常被抛出:
的 调用线程不能访问该对象10System.InvalidOperationException”在System.Reactive.Core。 DLL:因为不同的线程 拥有它
这是怎么发生的?我没有创建任何新的线程!
这是堆栈跟踪:
System.InvalidOperationException”在System.Reactive.Core.dll:因为不同的线程 拥有它
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()
的 调用线程不能访问该对象
你没有创建任何新的线程?也许你对Task的概念不熟悉。阅读[本文](https://docs.microsoft.com/en-us/dotnet/csharp/async)以获取信息 –
@CamiloTerevinto。不,我没有创建任何新的线程。我在哪里创建线程?据我所知,任务不涉及创建任何线程。你知道WebClient.DownloadStringTaskAsync方法是否正在另一个线程上运行任务吗? – SuperJMN
@CamiloTerevinto你能告诉我,Task.FromResult((=)=> 1)是否在一个新的线程上运行?请停止downvoting,请,并开始给出有用的答案。否则,让别人去做。 – SuperJMN