c# – ReactiveUI命令并发(WebClient)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – ReactiveUI命令并发(WebClient),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3808字,纯文字阅读大概需要6分钟。
内容图文
我正在使用RxUI 8的最新预发行版,但我认为这将在以前的版本中发生.
我在我的WPF应用程序中定义了这个ReactiveCommand:
GetWebsiteCommand = ReactiveCommand.CreateFromTask(DownloadString);
private async Task<string> DownloadString()
{
using (var client = new WebClient())
{
return await client.DownloadStringTaskAsync("http://www.google.es");
}
}
执行该命令时,将引发以下异常:
System.InvalidOperationException’ at System.Reactive.Core.dll: The
calling thread cannot access this object because a different thread
owns it
为什么会这样?我没有创建任何新线程!
这是堆栈跟踪:
System.InvalidOperationException’ at System.Reactive.Core.dll: The
calling thread cannot access this object because a different thread
owns it
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()
解决方法:
通过堆栈跟踪判断,您将canExecute管道传递给命令.对于您提供的任何管道,您有责任确保它在正确的线程上打勾.如果它在后台线程上打勾,则命令CanExecute事件将在同一个线程上打勾,因此UI将尝试从错误的线程更新关联Button上的IsEnabled属性.
因此,您可能需要针对canExecute管道添加ObserveOn调用.
更新:回答here.
内容总结
以上是互联网集市为您收集整理的c# – ReactiveUI命令并发(WebClient)全部内容,希望文章能够帮你解决c# – ReactiveUI命令并发(WebClient)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。