2013-08-05 5 views
2

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

Private _busyThread As Thread 
Private _waitWindow As WaitWindow 'This is the window with the animation 

Private Sub StartBusyIndicator(ByVal busyInfo As BusyInfo) 
    _busyThread = New Thread(New ThreadStart(AddressOf ThreadStartingPoint)) 
    _busyThread.SetApartmentState(ApartmentState.STA) 
    _busyThread.IsBackground = True 
    _busyThread.Start() 
End Sub 

Private Function ThreadStartingPoint() As ThreadStart 
    _waitWindow = New WaitWindow 
    _waitWindow.Show() 
    System.Windows.Threading.Dispatcher.Run() 
End Function 

Как я могу закрыть это изящно, когда это необходимо? Я не могу получить доступ к _waitWindow из основного потока пользовательского интерфейса, чтобы закрыть его. Если я выдаю _busyThread.Abort(), он фактически не закрывает окно.

+2

Если ваш дизайн настаивает на запуске в потоке пользовательского интерфейса, что-то, вероятно, не так с ним, и, скорее всего, можно реорганизовать его так, чтобы у вас все еще был только один поток пользовательского интерфейса. В крайне невероятном случае вам действительно нужен второй поток пользовательского интерфейса, вы можете всегда запускать отдельный процесс и использовать именованные каналы для связи между двумя –

+0

. Каков длительный процесс, выполняемый в потоке пользовательского интерфейса? Рид правильно, что процесс должен быть удален с пользовательского интерфейса. – Gauthier

+0

Да, ему нужен рефакторинг. До этого времени я искал быстрое исправление. –

ответ

3

Вы должны использовать Dispatcher.BeginInvoke, чтобы закрыть окно:

Это маршалы вызов, чтобы закрыть окно в резьбу нового окна.

Это не будет закрывать эту нить. Чтобы сделать это, попробуйте:

_waitWindow.Dispatcher.BeginInvoke(Sub() 
     _waitWindow.Dispatcher.BeginInvokeShutdown(DispatcherPriority.Background) 
     _waitWindow.Close() 
    End Sub) 

У меня есть article on my blog, который обсуждает этот вопрос, а также другие вопросы, в деталях. Он находится на C#, но может быть легко преобразован в VB.Net.

Обратите внимание, что в конечном итоге выяснение того, как переместить процесс длительной работы с основного потока, будет лучшим решением, поскольку это все равно оставит ваше приложение неприемлемым для Windows и вашего конечного пользователя.

+0

Должен ли я фактически прервать вторую нить? Или он очистится? –

+1

@MikeCole Показано, как справиться с этим. –

+0

Отличное сообщение в блоге. Была ли когда-либо часть 2? –

Смежные вопросы