以下c#代码的vb.net等价是什么?
var thread = new Thread(() =>
{
Dispatcher.CurrentDispatcher.BeginInvoke ((Action)(() => new MySplashForm().Show()));
Dispatcher.Run();
});
答案 0 :(得分:2)
取决于VB.Net的版本。
Dim thread As New Thread(
Sub()
Dispatcher.CurrentDispatcher.BeginInvoke (
Sub()
Dim form = new MySplashForm()
form.Show()
End Sub)
Dispatcher.Run()
End Sub)
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
这将使托管启动窗体的线程能够正常关闭。 (这也会导致关闭表单的副作用,因此您不需要这样做。)