调用线程不能访问此对象

问题描述:

在我的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。

请给我你的宝贵意见。

+0

“我不想使用调度程序,因为它冻结UI” - 如果工作线程将使用'Dispatcher'不时,用户界面将负责。我希望你的'WorkerMethod'不会更新批量UI。 'btn_convert.Content =“转换”'会在一毫秒内冻结用户界面。 – Dennis 2013-03-15 07:18:51

+0

你可以调用异步版本Dispatcher.BeginInvoke,而不是调用 – David 2013-03-15 07:23:25

+0

我认为你在WorkerMethod中做了一些重要的工作,而不仅仅是UI更新。您应该只从Dispatcher.Invoke更新UI。我不明白为什么会造成问题 – 2013-03-15 07:29:10

我不想使用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工作更容易,但它取决于还在进行什么。

+0

它确实对我非常感谢。非常感谢。 – Sangeetha 2013-03-15 07:37:18

UI更改只能由主线程应用。您可以检查主线程调用是必要的:

if (btn_convert.InvokeRequired) 
{ 
    btn_convert.Invoke((MethodInvoker)(() => btn_convert.Content = "Convert")); 
}