具有ObservesProperty的多线程

kvuong

我有这样的命令:

CancelCommand = new DelegateCommand(Cancel, () => IsProcessing).ObservesProperty(() => IsProcessing);

然后用另一种方法

Task.Factory.StartNew(() =>
            {
                IsProcessing = true; // Stop here
                IsProcessing = false;
            });

设置为时,执行会IsProcessing某种方式停止true但是当我改变为

Application.Current.Dispatcher.Invoke(() => IsProcessing = true);
IsProcessing = false; // Hit this line then stop again
int i = 0; // Never reach here

在非UI线程中设置时,看起来ObservesProperty会引起问题IsProcessing是bug还是按设计工作?

埃利·阿尔贝尔(Eli Arbel)

这个问题不是Prism独有的。所有Prism都将其连接到INotifyPropertyChanged您指定的属性并调用CanExecuteChanged事件。

该事件ICommand.CanExecuteChanged可能导致UI元素发生更改(例如更改按钮IsEnabled属性的值)-因此必须从UI线程中调用它。与绑定引擎不同,它不会自动执行此操作。

您应该:

  • 在启动线程之前/之后,从UI线程设置属性。使用async / await会很容易:

    async Task DoStuff() // start this method from the UI thread
    {
        IsProcessing = true;
        try
        {
            await Task.Run(() => { ... });
        }
        finally
        {
            IsProcessing = false;
        }
    }
    
  • 使用Dispatcher.InvokeAsync千万不能使用Invoke-那只是浪费了UI,完成一个线程等待。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

具有ObservesProperty的多线程

来自分类Dev

具有多线程的printf()

来自分类Dev

具有LinkedList的多线程

来自分类Dev

具有多线程的ConcurrentQueue

来自分类Dev

具有很多线程的休眠用法

来自分类Dev

具有对齐的int的多线程读写

来自分类Dev

具有非空函数的多线程

来自分类Dev

具有多线程或任务的进程队列

来自分类Dev

具有Akka和多线程的JMS

来自分类Dev

具有重载成员函数的多线程

来自分类Dev

具有非空函数的多线程

来自分类Dev

具有多线程的 Python 装饰器

来自分类Dev

具有相互独立线程的多线程开销

来自分类Dev

具有相互独立线程的多线程开销

来自分类Dev

具有QThread和线程模块的Python多线程

来自分类Dev

Java-具有同步方法的多线程练习

来自分类Dev

具有类成员函数的C ++ 11多线程

来自分类Dev

具有队列和多线程的python中的分段错误

来自分类Dev

具有多线程的Scala单例对象

来自分类Dev

具有模板化类成员函数的多线程

来自分类Dev

具有固定键的字典上的多线程

来自分类Dev

原子加法与具有多线程的多个变量(在C中)

来自分类Dev

在R中使用具有多线程的包

来自分类Dev

具有(春季)ThreadPoolTaskExecutor的多线程应用程序

来自分类Dev

具有多线程卷曲请求的段错误

来自分类Dev

具有多线程的Collection.sort()中的NullpointerException

来自分类Dev

具有标准库的c ++多线程:比预期的慢

来自分类Dev

具有std :: thread的多线程嵌套foor循环

来自分类Dev

具有共享资源的多线程服务器