WPF:等待动画窗口块

时间:2013-02-25 07:10:47

标签: wpf vb.net multithreading animation

我在SO和其他地方看到了几个类似的问题,但似乎没有一个对我有用。

我的项目中有一个小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

除了加载动画不播放外,一切都按预期工作。我做错了什么?

3 个答案:

答案 0 :(得分:1)

  

我做错了什么?

你这样做:

resetEvent.WaitOne()

阻止UI线程。不要那样做。相反,请记住UI基本上是基于事件的 - 除非您在VB 11中使用异步功能,否则您必须以基于事件的方式编写代码。所以基本上当你的长期任务完成时,你需要回发到UI线程来执行WaitWindow.Close()部分。

如果您可以使用.NET 4.5和VB 11,您可以使用Task.Run为长时间运行的工作启动新任务,然后Await该任务来自异步方法。

答案 1 :(得分:0)

它们都在UI线程上运行,这就是加载动画等待的原因。尝试将BackgroundWorker用于LongRunningLoading过程,然后根据结果需要返回UI线程。

答案 2 :(得分:0)

这种方法对我有用:

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

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

    waitwindow.ShowDialog()

可以帮助别人。