2013-02-25 82 views
0

我在SO和其他地方看到過幾個類似的問題,但似乎沒有一個適合我。WPF:等待動畫窗口塊

我在我的項目中有一個小的Window,其中包含我在應用程序啓動時顯示的LoadingAnimation並希望保持實際處理運行。這裏是我的啓動代碼:

Dim WaitWindow As New WaitWindow("Loading application...") 
WaitWindow.Show() 
LongRunningLoading() 
WaitWindow.Close() 

這裏的LongRunningLoading()功能,我嘗試在一個單獨的線程運行,以避免阻塞我的動畫:

Private Function LongRunningLoading() As Boolean 
    Dim resetEvent As New System.Threading.ManualResetEvent(False) 

    Dim RetVal As Boolean = False 
    ThreadPool.QueueUserWorkItem(Sub(state) 
            'DO SOMETHING AND RETURN RESULTS 
            resetEvent.Set() 
           End Sub, 
           RetVal) 

    resetEvent.WaitOne() 
    Return RetVal 
End Function 

一切正常,只是加載動畫不玩了。我究竟做錯了什麼?

回答

0

這種方式爲我工作:

Dim waitwindow As New WaitWindow("Loading application...") 

    ThreadPool.QueueUserWorkItem(_ 
     Sub() 
      LongRunningLoading() 
      Dispatcher.Invoke(New Action(AddressOf waitwindow.Close)) 
     End Sub) 

    waitwindow.ShowDialog() 

可以幫助別人。

0

它們都在UI線程上運行,這就是加載動畫等待的原因。嘗試爲您的LongRunningLoading過程使用BackgroundWorker,並根據您的結果需要返回到UI線程。

+0

不是QueueUserWorkItem()啓動一個新的線程? – dotNET 2013-02-25 07:16:15

1

我在做什麼錯?

你這樣做:

resetEvent.WaitOne() 

阻止UI線程。不要這樣做。相反,請記住,UI基本上是基於事件的 - 除非您使用VB 11中的異步功能,否則必須以基於事件的方式編寫代碼。所以基本上當你長時間運行的任務完成時,你需要回到UI線程執行WaitWindow.Close()部分。

如果可以使用.NET 4.5和VB 11,你可以用Task.Run開始爲您的長時間運行工作的新任務,然後從Await一個異步方法的任務。