【发布时间】:2022-03-06 17:53:33
【问题描述】:
尝试从另一个线程访问 WPF 控件会导致 'System.InvalidOperationException'(跨线程访问冲突)。 异常的描述说,访问的对象不属于调用线程。
以下代码显示,当第二个线程访问非 WPF-Control 对象时,不会引发 'System.InvalidOperationException'。但是为什么呢?
如何确定哪个对象由哪个线程拥有以避免此异常?
namespace Threading {
public class TestObject {
public Object Data { get; set; }
}
public partial class MainWindow : Window {
TestObject _toOwnedByUI;
TextBox _txtOwnedByUI;
BackgroundWorker _bw;
public MainWindow () {
InitializeComponent ();
_bw = new BackgroundWorker ();
_txtOwnedByUI = OutputBox;
_bw.DoWork += onBwDoWork;
}
private void Button_Click (object sender, RoutedEventArgs e) {
// initvalues from UI-Thread
_toOwnedByUI = new TestObject () { Data = "UI Thread INIT" };
_txtOwnedByUI.Text = "UI Thread INIT";
// Start Second Thread
_bw.RunWorkerAsync ();
}
// -------------------------------------------------------------------------
private void onBwDoWork(Object Sender, DoWorkEventArgs e) {
// Change Values of testobjects by Second Thread
_toOwnedByUI.Data = "Changed by BW-Thread";
_txtOwnedByUI.Text = "Changed by BW-Thread"; // <----- throws System.InvalidOperationException : Invalid Thread
}
}
}
【问题讨论】:
-
只有 UI 对象具有线程亲和性,您的 TestObject 类的对象可以从任何线程访问。
标签: c# wpf multithreading