2013-12-15 98 views
0

我使用WPF,在我的主窗口,每當我嘗試做任何事情它給了我這個錯誤 「因爲不同的線程擁有它調用線程不能訪問此對象。」 這些例如,C#WPF異常

this.Visibility = Visibility.Visible 
((Storyboard)this.FindResource("HideWindow")).Begin() 

我嚴重不知道那是什麼,並幫助大量需要我不能執行我的代碼的第一個行。 更多信息: 我不能打開另一個窗口,讓我線程不是STA錯誤

LoginWindow objLoginWindow = new LoginWindow(); 
objLoginWindow.ShowDialog(); 
objLoginWindow = null; 

這是個例外。

System.InvalidOperationException was unhandled by user code 
HResult=-2146233079 
Message=The calling thread cannot access this object because a different thread owns it. 
Source=WindowsBase 
StackTrace: at System.Windows.DependencyObject.SetValue(DependencyProperty dp, Object value) 
at Menupedia.LoadingWindow.OpenNewWindow() in c:\Users\xxxx\Desktop\menupedia\Menupediaa\Menupedia\LoadingWindow.xaml.cs:line 51 
at Menupedia.LoadingWindow.TimeElapsed(Object sender, ElapsedEventArgs e) in c:\Users\xxxx\Desktop\menupedia\Menupediaa\Menupedia\LoadingWindow.xaml.cs:line 39 
at System.Timers.Timer.MyTimerCallback(Object state) 
+0

但你不啓動一個單獨的線程? – Clemens

+0

我試過使用不同的線程。好吧,它的工作,並讓我加載新的窗口。但另一種是左後衛有我不能把它藏在任何方式.. –

+0

你的意思是不是執行故事板?你可能會提供更多關於你想達到的信息。 – Clemens

回答

5

你的堆棧跟蹤顯示您使用System.Timers.Timer。 Timer的Elapsed處理程序在後臺線程中調用,後者不允許直接訪問UI元素。你必須調用Dispatcher.InvokeDispatcher.BeginInvoke訪問UI元素在Elapsed處理。

然而,將定時器替換System.Windows.Threading.DispatcherTimer可能更容易一些,該事件具有在UI線程中調用的Tick事件,因此允許安全訪問UI元素。

0

該錯誤表明有一個單獨的線程試圖訪問它是由UI線程所擁有的項目,這將創建一個問題,來說明問題,我會給你一個簡單的什麼例如,如果您有兩個並行運行的蒸汽火車,你想要做的是讓第一列車使用其他列車煤炭,這顯然不能,你就需要詢問列車司機停下讓他可以讓你訪問它。

現在做到這一點的方法是......

Application.Current.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(() => 
{ 
    //Access the UI thread and where the storyboard is located 
    this.Visibility = Visibility.Visible 
    ((Storyboard)this.FindResource("HideWindow")).Begin() 
})); 
+0

好吧,我得到了什麼問題的含義。但TBH這是不符合邏輯的,因爲我只有一個線程是運行該窗口本身 –

+1

如克萊門所說,System.Timers.Timer一個單獨的線程操作MainProgram(主程序)。 –