c#wpf CanExecuteChanged属性在不同线程上更改

c#wpf CanExecuteChanged属性在不同线程上更改,c#,wpf,multithreading,command,C#,Wpf,Multithreading,Command,我有一个问题,当我更改属性时,CanExecuteChanged没有完成。我几乎明白了原因。然而,我真的不知道如何修复它。问题显然来自更改不同线程上的属性 我的代码。。 命令: 在一个单独的线程上调用的东西: /// <summary> /// Start the testing /// </summary> public void StartTest() { StartSerial(); ExecuteSe

我有一个问题,当我更改属性时,CanExecuteChanged没有完成。我几乎明白了原因。然而,我真的不知道如何修复它。问题显然来自更改不同线程上的属性

我的代码。。 命令:

在一个单独的线程上调用的东西:

/// <summary>
    /// Start the testing
    /// </summary>
    public void StartTest()
    {
        StartSerial();
        ExecuteSelectedTests();
        StopSerial();
    }

/// <summary>
    /// start serial communication
    /// </summary>
    private void StartSerial()
    {
        serialManager.Start(serialPortNo);
    }
    /// <summary>
    /// stop serial communication
    /// </summary>
    private void StopSerial()
    {
        serialManager.Stop();
    }
    /// <summary>
    /// runs the selected tests
    /// </summary>
    private void ExecuteSelectedTests()
    {
        this.IsTestRunning = true;
        foreach (var item in testItemsToRunCollection)
        {
            item.Execute();
        }
        this.IsTestRunning = false;
    }
//
///开始测试
/// 
公共无效开始测试()
{
StartSerial();
ExecuteSelectedTests();
StopSerial();
}
/// 
///启动串行通信
/// 
私有无效StartSerial()
{
serialManager.Start(serialPortNo);
}
/// 
///停止串行通信
/// 
私有void StopSerial()
{
serialManager.Stop();
}
/// 
///运行选定的测试
/// 
私有void ExecuteSelectedTests()
{
this.IsTestRunning=true;
foreach(testItemsToRunCollection中的var项)
{
item.Execute();
}
this.IsTestRunning=false;
}

因此,ISetRunning是从另一个线程设置的。我想知道解决这个问题的正确方法是什么:)

您可以像这样调度要在UI线程上运行的代码:

 Dispatcher.Invoke(((Action)(() => ]
      {
         this.IsTestRunning = false;
         CommandManager.InvalidateRequerySuggested();
      })));

它不会阻止用户界面?因为那条线有很多事情要做。将运行至少几分钟到几小时您正在发送值更改,所以没问题。对不起,我没听清楚。我想这将是最合理的解决方案:)非常感谢向分派的代码添加
CommandManager.invalidateRequestSuggested()
。这就成功了。最后的代码:`Application.Current.Dispatcher.Invoke(((操作)(()=>{this.IsTestRunning=false;CommandManager.invalidateRequestSuggested();}))`理想情况下,什么时候应该为“ISestrunning=false”?是在所有测试项都已完成执行时,还是在至少一个测试项已完成执行时?所有测试项。在特定条件下,可能需要几个小时。什么是“testItemsToRunCollection”?另外,您可以并行运行item.Execute()吗?如果它们彼此没有任何依赖关系。testItemsToRunCollection的类型是自定义类对象的ObservableCollection。将它们并行运行是不可能的。
 Dispatcher.Invoke(((Action)(() => ]
      {
         this.IsTestRunning = false;
         CommandManager.InvalidateRequerySuggested();
      })));