我需要从winform app调用一个单独的线程并等待它,只要它的工作完成而没有锁定UI,例如:
// ButtonClick event handler
Thread t = new Thread(OnThread);
t.Start();
MessageBox.Show("Complete");
voin OnThread()
{
// some long running work here..
}
因此,当OnThread函数返回时,消息框应该出现。 想法?
答案 0 :(得分: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");
}
答案 1 :(得分: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 { };