San*_*tha 0 c# wpf multithreading
在我的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();
}
Run Code Online (Sandbox Code Playgroud)
在我的WorkerMethod()方法中,我有一些代码,如下面的行:
btn_convert.Content = "Convert";
Run Code Online (Sandbox Code Playgroud)
当它到达此行时,它会抛出异常,因为调用线程无法访问此对象,因为另一个线程拥有它.
我不想使用Dispatcher,因为它冻结了UI.UI应该是响应式的,所以我没有选择Dispatcher invoke或BeginInvoke.
请给我你宝贵的建议.
我不想使用Dispatcher,因为它冻结了UI.UI应该响应,所以我不选择Dispatcher invoke或BrginInvoke.
这只是表明你已经严重使用了调度员.
您必须从UI线程访问UI.这并不意味着你WorkerMethod需要在UI线程上运行,但这一行:
btn_convert.Content = "Convert";
Run Code Online (Sandbox Code Playgroud)
肯定的.因此,您可能希望保留当前用于启动线程的代码(但是您确实需要设置公寓状态),但更改访问UI的任何代码以使用调度程序.例如:
Action setButtonContentAction = () => btn_convert.Content = "Convert";
Dispatcher.BeginInvoke(setButtonContentAction);
Run Code Online (Sandbox Code Playgroud)
或者,根据您的WorkerThread操作 - 以及您是否使用C#5 - 您可能希望使用新的异步功能.这可以使UI更容易在UI线程上工作,但它确实依赖于正在发生的其他事情.