0

我在 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

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

4

3 回答 3

1

我究竟做错了什么?

你这样做:

resetEvent.WaitOne()

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

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

于 2013-02-25T07:14:55.257 回答
0

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

于 2013-02-25T07:14:05.380 回答
0

这种方法对我有用:

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

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

    waitwindow.ShowDialog()

可以帮助别人。

于 2013-03-02T14:47:32.307 回答