2013-11-23 5 views
0

нужно вызвать отдельный поток из Winform приложение и ждет его, пока его работа не будет завершена без блокировки пользовательского интерфейса, например:Вызов Thread, который возвращает после завершения

// ButtonClick event handler 
Thread t = new Thread(OnThread); 
t.Start(); 
MessageBox.Show("Complete"); 

voin OnThread() 
{ 
    // some long running work here.. 
} 

Так MessageBox должен появляется, когда Функция OnThread возвращается. Идеи?

ответ

0

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

Наиболее применимо решение с учетом нашего разговора, было бы вызвать событие после того, как метод OnMethod завершен, а затем код вашего продолжение внутри обработчика событий, как этот

private void buttonSomething_Click(object sender, EventArgs eventArgs) 
{ 
    OnMethodCompleted += (s, e) => 
    { 
     MessageBox.Show("..."); 
    }; 
    Thread thread = new Thread(OnMethod); 
    thread.Start(); 
} 

private void OnMethod() 
{ 
    // Some long running operation here.. 
    OnMethodCompleted(this, EventArgs.Empty); 
} 

private static event EventHandler OnMethodCompleted = delegate { }; 
+0

MessageBox - пример только. Я действительно смог бы вывести другой поток и дождаться его. Я использую .NET 4.0 Существуют ли другие решения? – bit

+0

@bit Затем вы можете использовать TPL и сопутствующий класс 'Task'. Обновлен мой ответ. –

+0

Возможно ли это без использования класса Task? – bit

2

Вы можете играть с делегатами.

var threadStart = new ThreadStart(OnThread); 
threadStart+= OnThreadEnds;//<--Combine multicast delegate 
Thread t = new Thread(threadStart); 
t.Start(); 

void OnThread() 
{ 
    // some long running work here.. 
} 

voin OnThreadEnds() 
{ 
    // Here pass the control to UI thread and show message box 
    //MessageBox.Show("Complete"); 
} 
Смежные вопросы