VB相当于以下线程代码

时间:2010-09-09 15:57:29

标签: wpf multithreading c#-to-vb.net

以下c#代码的vb.net等价是什么?

var thread = new Thread(() => 
    { 
        Dispatcher.CurrentDispatcher.BeginInvoke ((Action)(() => new MySplashForm().Show())); 
        Dispatcher.Run(); 
    }); 

2 个答案:

答案 0 :(得分:2)

取决于VB.Net的版本。

版本10.0

Dim thread As New Thread(
  Sub() 
    Dispatcher.CurrentDispatcher.BeginInvoke (
      Sub() 
        Dim form = new MySplashForm()
        form.Show()
      End Sub)
    Dispatcher.Run()
  End Sub)

版本9.0

Sub ShowForm() 
  Dim form = new MySplashForm()
  form.Show()
End Sub

Sub CreateForm()
  Dispatcher.CurrentDispatcher.BeginInvoke(AddressOf ShowForm)
  Dispatcher.Run()
End Sub

Dim thread as New Thread(AddressOf CreateForm)

我不是100%肯定你想要实现的目标。您实质上是创建另一个线程来异步显示一个表单,然后立即强制执行异步操作。看起来通过BeginInvoke异步显示并放弃创建另一个线程的想法似乎要容易得多。

答案 1 :(得分:0)

请注意,C#代码(以及VB.NET等效代码)将泄漏一个线程。它通过调用Run启动调度程序,但它从不关闭它。

显然,这假设你确实在某个时刻开始执行线程,这两个例子都没有。您需要以下代码才能使用其他代码:

thread.SetApartmentState(ApartmentState.STA)
thread.Start()

无论尝试关闭启动画面的任何代码,您都需要能够抓住调度程序并将其关闭的代码。例如,你的MySplashForm可能有这个:

Public Sub ShutdownSplashThread()
    Dispatcher.BeginInvokeShutdown(DispatcherPriority.Normal)
End Sub

这将使托管启动窗体的线程能够正常关闭。 (这也会导致关闭表单的副作用,因此您不需要这样做。)