【发布时间】:2013-03-15 07:14:06
【问题描述】:
在我的 wpf 应用程序中,我在按钮单击中添加了一段代码,如下所示:
private void btn_convert_Click(object sender, RoutedEventArgs e)
{
Thread t = new Thread(new ThreadStart(WorkerMethod));
t.SetApartmentState(ApartmentState.MTA);
t.IsBackground = true;
t.Start();
}
在我的WorkerMethod() 方法中,我有一些类似于下面一行的代码:
btn_convert.Content = "Convert";
当它到达这一行时,它会抛出异常,因为调用线程无法访问该对象,因为另一个线程拥有它。
我不想使用 Dispatcher,因为它会冻结 UI。UI 应该是响应式的,所以我没有选择 Dispatcher 调用或 BeginInvoke。
请给我您宝贵的建议。
【问题讨论】:
-
“我不想使用 Dispatcher,因为它会冻结 UI” - 如果工作线程不时使用
Dispatcher,则 UI 将负责。我希望您的WorkerMethod不会进行批量 UI 更新。btn_convert.Content = "Convert"将在一毫秒内冻结 UI。 -
可以调用异步版本的Dispatcher.BeginInvoke,而不是Invoke
-
我认为您正在 WorkerMethod 中做一些繁重的工作,而不仅仅是 ui 更新。您应该只从 Dispatcher.Invoke 更新 UI。我不明白为什么这会造成问题
-
直接进入视图并不是 WPF 中的最佳实践。您应该使用 MVVM 模式。看codeproject.com/Articles/81484/…
标签: c# wpf multithreading