WPF:等待动画窗口块

WPF:等待动画窗口块,wpf,vb.net,multithreading,animation,Wpf,Vb.net,Multithreading,Animation,我在某某和其他地方见过几个类似的问题,但似乎没有一个对我有效 我在我的项目中有一个小的窗口,其中包含一个在应用程序启动时显示的窗口,我希望保持实际处理运行。以下是我的启动代码: Dim WaitWindow As New WaitWindow("Loading application...") WaitWindow.Show() LongRunningLoading() WaitWindow.Close() 下面是我尝试在单独的线程上运行的LongRunningLoading()函数,以避免阻

我在某某和其他地方见过几个类似的问题,但似乎没有一个对我有效

我在我的项目中有一个小的
窗口
,其中包含一个在应用程序启动时显示的窗口,我希望保持实际处理运行。以下是我的启动代码:

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

除了加载动画无法播放外,所有操作均按预期进行。我做错了什么?

它们都在UI线程上运行,这就是加载动画等待的原因。尝试在LongRunningLoading过程中使用BackgroundWorker,然后在需要时返回UI线程以获得结果

我做错了什么

您正在这样做:

resetEvent.WaitOne()
这会阻塞UI线程。不要那样做。相反,请记住UI基本上是基于事件的——除非您使用VB11中的异步功能,否则您必须以基于事件的方式编写代码。因此,基本上,当长时间运行的任务完成时,您需要返回到UI线程以执行
WaitWindow.Close()
部分


如果可以使用.NET 4.5和VB 11,则可以使用
Task.Run
为长期运行的工作启动一个新任务,然后
通过异步方法等待该任务。

这种方法对我有效:

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

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

    waitwindow.ShowDialog()
我可以帮助别人