调用线程不能访问此对象
在我的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 invoke或BeginInvoke。
请给我你的宝贵意见。
我不想使用Dispatcher,因为它冻结了UI .. UI应该是响应式的,所以我没有选择Dispatcher invoke或BrginInvoke。
这只是表明你已经很糟糕地使用了调度程序。
您必须从UI线程访问UI。这并不意味着你的整个WorkerMethod
需要在UI线程上运行,但此行:
btn_convert.Content = "Convert";
绝对不会。所以你可能想保留当前用于启动线程的代码(你是否真的需要设置公寓状态),但改变任何访问UI的代码来使用调度程序。例如:
Action setButtonContentAction =() => btn_convert.Content = "Convert";
Dispatcher.BeginInvoke(setButtonContentAction);
或者,取决于你的WorkerThread
做 - 如果你正在使用C#5 - 你可能要使用新的异步功能。这可以让在UI线程上保持UI工作更容易,但它取决于还在进行什么。
它确实对我非常感谢。非常感谢。 – Sangeetha 2013-03-15 07:37:18
UI更改只能由主线程应用。您可以检查主线程调用是必要的:
if (btn_convert.InvokeRequired)
{
btn_convert.Invoke((MethodInvoker)(() => btn_convert.Content = "Convert"));
}
“我不想使用调度程序,因为它冻结UI” - 如果工作线程将使用'Dispatcher'不时,用户界面将负责。我希望你的'WorkerMethod'不会更新批量UI。 'btn_convert.Content =“转换”'会在一毫秒内冻结用户界面。 – Dennis 2013-03-15 07:18:51
你可以调用异步版本Dispatcher.BeginInvoke,而不是调用 – David 2013-03-15 07:23:25
我认为你在WorkerMethod中做了一些重要的工作,而不仅仅是UI更新。您应该只从Dispatcher.Invoke更新UI。我不明白为什么会造成问题 – 2013-03-15 07:29:10