.NET对Window.WindowStyle属性的线程安全调用

时间:2012-01-05 03:22:34

标签: .net multithreading

我目前正在创建一个运行两个线程的应用程序,其中一个经常需要设置Window.WindowStyle属性,但是当我尝试这样做时出现错误(因为我的调用不是线程安全的)。我已经知道如何使用InvokeRequired方法解决这个问题,但是当我输入this.WindowStyle.InvokeRequired时,Viusal Studio说InvokeRequired不是有效的属性。

我该如何解决这个问题?

请注意,我的应用程序是WPF应用程序,而不是表单。我更喜欢使用C#术语的答案,因为我不太了解VB.NET。

感谢您的帮助!

编辑:好的,所以this.Dispatcher.CheckAccess()似乎修复了初始问题,但是当我尝试在“if”语句中实际调用时,我现在遇到了同样的错误。有什么建议吗?

2 个答案:

答案 0 :(得分:1)

如果您在此使用SynchronizationContext而不是旧的ISynchronizeInvoke界面,我认为您会取得更大的成功。

在WPF应用程序启动的某个地方,您应该创建一个同步上下文,如下所示:

SynchronizationContext SyncContext = new DispatcherSynchronizationContext();

此代码将使用当前调度程序创建同步上下文,因此您可能会在调度程序启动后在主窗口初始化期间调用此方法。

接下来,使用SendPost方法将代码编组到GUI线程中:

SyncContext.Send(delegate(object obj) {
    // set main window style here, for example:
    MainWindow.WindowStyle = WindowStyle.SingleBorderWindow;
}, null);

在代码项目中有一篇关于同步上下文的好文章:http://www.codeproject.com/KB/threads/SynchronizationContext.aspx,但它特定于Windows窗体。

答案 1 :(得分:0)

您需要检查if (this.Dispatcher.CheckAccess())