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