VB Эквивалент следующего кода для потоков - PullRequest
0 голосов
/ 09 сентября 2010

Что такое vb.net-эквивалент следующего кода c #?

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

Ответы [ 2 ]

2 голосов
/ 09 сентября 2010

Зависит от версии 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 и отказаться от идеи создания другого потока.

0 голосов
/ 05 ноября 2010

Обратите внимание, что код C # (и его эквиваленты в VB.NET) будут пропускать поток. Он запускает диспетчер, вызывая Run, но никогда не выключает его.

Очевидно, это предполагает, что вы действительно запускаете поток в какой-то момент, чего не делает ни один пример. Вам понадобится следующий код, чтобы остальные могли быть полезны:

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

В любом коде, который пытается закрыть экран-заставку, вам понадобится что-то, что захватит диспетчер и отключит его. Например, ваша MySplashForm может иметь это:

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

Это позволит корректно завершить работу потока, в котором находится форма-заставка. (И это также будет иметь побочный эффект закрытия формы, так что вам не нужно это делать.)

...