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()
我可以帮助别人