2012-01-05 75 views
0

我目前正在製作一個應用程序,其中有兩個線程正在運行,而且經常需要設置Window.WindowStyle屬性,但是當我嘗試這樣做(因爲我的電話不是線程安全的)。我已經意識到如何使用InvokeRequired方法解決這個問題,但是,當我輸入this.WindowStyle.InvokeRequired時,Viusal Studio說InvokeRequired不是一個有效的屬性。.NET線程安全調用Window.WindowStyle屬性

我該如何解決這個問題?

請注意,我的應用程序是一個WPF應用程序,而不是一個表單。我更喜歡C#術語的答案,因爲我不太瞭解VB.NET。

感謝您的幫助!

編輯:好的,所以this.Dispatcher.CheckAccess()似乎已經修復了最初的問題,但是當我試圖在「if」語句中實際調用時,現在我得到相同的錯誤。有什麼建議麼?

+0

不應該使用Window.InvokeRequired? – malkia 2012-01-05 03:28:08

+0

同樣的問題出現 – danielmhanover 2012-01-05 03:28:38

回答

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窗體。

+0

我會在// ...設置主窗口樣式這裏的區域? – danielmhanover 2012-01-05 03:41:28

+0

我修改了上面的代碼示例,爲您提供了一些想法。基本上,你把任何你想在主GUI線程上運行的東西放在那裏。在你的情況下,你正在主窗口上設置一個屬性。 – 2012-01-05 03:46:06

+0

我得到它的工作。謝謝! – danielmhanover 2012-01-05 03:48:57

0

你需要檢查if (this.Dispatcher.CheckAccess())

+0

我用什麼來代替SetTextCallback和this.Invoke? – danielmhanover 2012-01-05 03:28:01

+0

@ user788532:'this.Dispatcher.BeginInvoke(new Action(...))' – SLaks 2012-01-05 04:02:46