我在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
除了加载动画不播放外,一切都按预期工作。我做错了什么?
答案 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()
可以帮助别人。