我目前正在创建一个运行两个线程的应用程序,其中一个经常需要设置Window.WindowStyle属性,但是当我尝试这样做时出现错误(因为我的调用不是线程安全的)。我已经知道如何使用InvokeRequired方法解决这个问题,但是当我输入this.WindowStyle.InvokeRequired时,Viusal Studio说InvokeRequired不是有效的属性。
我该如何解决这个问题?
请注意,我的应用程序是WPF应用程序,而不是表单。我更喜欢使用C#术语的答案,因为我不太了解VB.NET。
感谢您的帮助!
编辑:好的,所以this.Dispatcher.CheckAccess()似乎修复了初始问题,但是当我尝试在“if”语句中实际调用时,我现在遇到了同样的错误。有什么建议吗?
答案 0 :(得分:1)
如果您在此使用SynchronizationContext
而不是旧的ISynchronizeInvoke
界面,我认为您会取得更大的成功。
在WPF应用程序启动的某个地方,您应该创建一个同步上下文,如下所示:
SynchronizationContext SyncContext = new DispatcherSynchronizationContext();
此代码将使用当前调度程序创建同步上下文,因此您可能会在调度程序启动后在主窗口初始化期间调用此方法。
接下来,使用Send
或Post
方法将代码编组到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())