2015-04-16 4 views
1

В моем приложении Vform.NET Winform я проверяю некоторые поля. В случае, если одно конкретное поле равно true Мне нужно показать сообщение. Обычно это будет так:Показать MessageBox modaly из фоновой темы

If (myField) Then 
    MessageBox.Show("Something is wrong", "Warning", MessageBoxButtons.OK) 

    // continuing... 
End If 

Это сообщение должно быть показано modaly (пользователь может вернуться к главной форме только после нажатия кнопки OK). Проблема в том, что я не хочу, чтобы поток дождался щелчка (просто покажите сообщение и продолжайте - не ждите кнопки OK).

Моя единственная идея состоит в том, чтобы показать сообщение в фоновом потоке:

If (myField) Then 
    Dim t As Thread = New Thread(AddressOf ShowMyMessage) 
    t.Start() 

    // continuing... 
End If 

Private Sub ShowMyMessage() 
    MessageBox.Show("Something is wrong", "Warning", MessageBoxButtons.OK) 
End Sub 

Но в этом случае сообщение не показан modaly (пользователь может вернуться к основной форме и взаимодействовать с ней без нажатия кнопки ОК).

Любые идеи?

+0

показать окно сообщения в потоке пользовательского интерфейса. Зачем здесь нужен рабочий поток? –

+0

Потому что поток пользовательского интерфейса останавливается на сообщении. После этого у меня есть код, и он выполняется только после закрытия сообщения – DanielH

+0

Вот в чем смысл диалога Modal. У вас есть проблема [XY Problem] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) вместо этого задайте исходный вопрос. –

ответ

1

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

Private Sub Button11_Click(sender As Object, e As EventArgs) Handles Button11.Click 
    Dim thr As New Thread(Sub() ThreadTest()) 
    thr.Start() 
End Sub 

Private Sub ThreadTest() 
    Debug.WriteLine("Started") 
    Me.ShowMessageBox("Can't click on the main form now", "Alert", MessageBoxButtons.OK, MessageBoxIcon.Exclamation) 
    Debug.WriteLine("Thread continued") 
End Sub 

Public Sub ShowMessageBox(textToShow As String, caption As String, buttons As MessageBoxButtons, icon As MessageBoxIcon) 
    Me.BeginInvoke(Sub() MessageBox.Show(textToShow, caption, buttons, icon)) 
End Sub 

Когда вы запустите ее, вы увидите, что ThreadTest код ведет мимо показом MessageBox, но никакого взаимодействия не допускается с основной формой, пока нормально не будет нажата в окне сообщения

+0

Я знаю, что дизайн не в порядке. BeginInvoke - именно то, что я искал. Благодаря! – DanielH