Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从代码更新UI线程_C#_Wpf_Multithreading - Fatal编程技术网

C# 从代码更新UI线程

C# 从代码更新UI线程,c#,wpf,multithreading,C#,Wpf,Multithreading,我应该如何编辑存在于C#任务之外的WPF数据?我已经使用标准WPF模板定义了一个UI。网格仅包含: <TextBlock x:Name="myTextBox" Text="Original Text" /> 这将引发以下异常: 调用线程无法访问此对象,因为其他线程拥有它 哪个线程拥有myTextBox?为什么我在编辑myInt时看不到这个错误?您试图做的是不可能的。您的代码在自己的线程中运行,与UI线程分离 你需要更多地了解WPF。要使这项工作正常进行,我知道有两种解决方案: 对模

我应该如何编辑存在于C#任务之外的WPF数据?我已经使用标准WPF模板定义了一个UI。网格仅包含:

<TextBlock x:Name="myTextBox" Text="Original Text" />
这将引发以下异常:

调用线程无法访问此对象,因为其他线程拥有它


哪个线程拥有myTextBox?为什么我在编辑myInt时看不到这个错误?

您试图做的是不可能的。您的代码在自己的线程中运行,与UI线程分离

你需要更多地了解WPF。要使这项工作正常进行,我知道有两种解决方案:

  • 对模型特性使用双向绑定
  • 实现调度器

  • 选项1是实现这一点的常用方法,因此了解双向绑定。调度程序对于您尝试执行的操作来说是过度的。

    只有UI线程应该更新UI元素。如果另一个线程需要更新UI,它应该要求UI线程更新。一种方法是通过。或者您可以使用双向绑定机制。将文本框绑定到模型上的属性,然后您可以更新模型,该模型将自动更新文本框。示例代码的问题在于它过于简单,没有任何理由需要启动另一个线程。如果您有更具体的需求来解释生成线程的原因,也许我们可以更具体地指导您。您需要使用async Wait或使用Dispatcher invoke将UI更新调用回UI线程。这被标记为欺骗,这是真的。但链接到WinForm解决方案,该解决方案不会遗留到WPF。重复答案应该链接到WPF解决方案。@rmcsharry WPF中的数据绑定是自切片面包以来最好的选择。花时间学习使用它是值得的。
    using System.Threading.Tasks;
    using System.Windows;
    
    namespace UpdateGUI
    {
      public partial class MainWindow : Window
      {
        private int myInt;
    
        public MainWindow()
        {
          InitializeComponent();
    
          myInt = 0;
          Task.Factory.StartNew(() =>
          {
            myInt++;
            myTextBox.Text = "New Text";
          });
        }
      }
    }