使代码在Sync VB.net中执行| WPF

时间:2018-07-06 12:16:15

标签: wpf vb.net

我正在WPF中设计一个应用程序,如果您单击一个按钮,它将加载该应用程序。例如,您按Spotify,它将加载Spotify。

事实是,有时打开应用程序(Spotify)会有延迟,这很正常!因此,我要添加一个加载区域,以便隐藏徽标,并且加载面板将显示在其位置!

效果不错,但我遇到了问题!出于某种原因,gui不会随我的加载而更新,而是先加载我的应用程序,然后在稍后用我的加载栏更新GUI的一会儿。我想要这样,所以只要用户按下按钮,他们便会立即看到此加载出现,然后在成功加载应用程序后消失。

按钮代码:

Dim syncTask As New Task(Of Long)(Function()
                                              MPanel_Spotify.Visibility = Windows.Visibility.Hidden 'Hide Button Info
                                              LoadPanel_Spotify.Visibility = Windows.Visibility.Visible 'Show Load
                                              Dim LPro = Process.Start(SpotifyGlobalDir)
                                              Console.WriteLine("Loading App")
                                              LPro.WaitForInputIdle()

                                              Dim ProcessCheck = Process.GetProcessesByName("Spotify")
                                              Do
                                                  Thread.Sleep(2000)
                                              Loop Until ProcessCheck.Count > 0

                                              Console.WriteLine("App loaded")
                                              ' LoadPanel_Spotify.Visibility = Windows.Visibility.Hidden 'Hide Load
                                              'MPanel_Spotify.Visibility = Windows.Visibility.Visible 'Show Button Info
                                              Return True
                                          End Function)
        syncTask.RunSynchronously()

我认为我可能需要一些多线程?但是,如果这样做,我会收到错误,因为我需要调用不知道怎么做的可见性更改?

1 个答案:

答案 0 :(得分:1)

尝试在后台线程上调用Process.StartThread.Sleep,但在UI线程上设置元素的Visibility属性:

MPanel_Spotify.Visibility = Windows.Visibility.Hidden 'Hide Button Info
LoadPanel_Spotify.Visibility = Windows.Visibility.Visible 'Show Load
Task.Run(Sub()
             Dim LPro = Process.Start(SpotifyGlobalDir)
             Console.WriteLine("Loading App")
             LPro.WaitForInputIdle()

             Dim ProcessCheck = Process.GetProcessesByName("Spotify")
             Do
                 Thread.Sleep(2000)
             Loop Until ProcessCheck.Count > 0
         End Sub) _
        .ContinueWith(Sub(t)
                          Console.WriteLine("App loaded")
                          LoadPanel_Spotify.Visibility = Windows.Visibility.Hidden 'Hide Load
                          MPanel_Spotify.Visibility = Windows.Visibility.Visible 'Show Button Info
                      End Sub, CancellationToken.None, TaskContinuationOptions.None, TaskScheduler.FromCurrentSynchronizationContext())

UI线程不能同时显示控件和休眠。一个线程一次只能做一件事。