我试图在我的函数中暂停一个线程,然后在单击一个按钮时将恢复该线程。 Windows表单应用程序
private readonly AutoResetEvent mre = new AutoResetEvent(false);
public void InstINP( int IntAcc)
{
BtnInp.Enabled = true; //enable text box
MessageBox.Show("Please input a value");
mre.WaitOne();
}
void BtnInp_Click(object sender, EventArgs e)
{
LblACC.Text = TxtInput.Text; //print to accumulator label
BtnInp.Enabled = false; //disable button
mre.Set();
}
这就是我的代码。我想暂停它说mre.WaitOne();并恢复它所说的mre.Set()。 但是,当此代码运行时,我无法按下程序上的任何按钮或与程序交互,这意味着我无法恢复该程序。
答案 0 :(得分:1)
你是对的。
mre.WaitOne()
会暂停该帖子。mre.Set()
确实恢复了帖子。您可能已经知道的其他事实:
你没想到的事情:
如果你想暂停一些逻辑,而不是整个线程,你可以使用C#任务:
tcs = new TaskCompletionSource<bool>()
await tcs.Task;
tcs.SetResult(true);
使用await
将暂停正在进行的操作并返回处理其他事件,例如按钮点击。
这种方式的工作原理是C#编译器会自动将代码拆分为多个函数调用,因此第一个可以返回到消息调度循环,剩下的代码可以在任务完成后调用。 await
关键字标记编译器将执行此拆分的位置。
重要提示:TaskCompletionSource
无法像AutoResetEvent
那样重置和重复使用。您必须为每个暂停/恢复周期构建一个新的。