2013-02-25 81 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一个异步方法的任务。