我想阻止一个函数并等待一个事件然后继续,在我的例子中,当我点击一个按钮时我想要的伪代码:
但实际代码不等待autoevent.Set()函数,所以当我想阻止主函数时,线程调用的函数仍然被阻塞。
我尝试了ManualResetEvent和AutoResetEvent,这是我用于AutoResetEvent的代码:
public partial class person : Form
{
AutoResetEvent auto = new AutoResetEvent(false);
private void button1_Click(object sender, EventArgs e)
{
int old_id, new_id;
//dataGridView1.ClearSelection();
Thread t1 = new Thread(new ThreadStart(th_remove));
Thread t2 = new Thread(new ThreadStart(th_replace));
t1.Start();
old_id = (int)dataGridView1.SelectedRows[0].Cells[1].Value;
t2.Start();
new_id = (int)dataGridView1.SelectedRows[0].Cells[1].Value;
DialogResult dialogResult = MessageBox.Show("Remplacer", "Vous êtes sûr de vouloir remplacer ?", MessageBoxButtons.YesNo);
if (dialogResult == DialogResult.Yes)
{
db.replace("person", new_id, old_id);
}
}
private void th_replace()
{
auto.WaitOne();
MessageBox.Show("Seléctionnez la ligne remplaçante");
}
private void th_remove()
{
auto.WaitOne();
MessageBox.Show("Seléctionnez la ligne à supprimer");
}
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
auto.Set();
}
}
提前致谢
答案 0 :(得分:3)
我想阻止一个函数并等待一个事件然后继续
基本上不是事件驱动的GUI如何工作。你不应该阻止UI线程 - 它将阻止屏幕刷新,窗口被拖动,关闭等。
相反,您应该禁用在进行其他处理时不希望可用的所有操作,并且当事件发生时,回调到UI线程(例如,使用Control.Invoke
)重新启用相关的控制,并继续你的逻辑。
答案 1 :(得分:1)
您可以尝试添加同步对象,并在同步对象上使用Monitor's方法Wait
和Pulse
。也就是说,您需要在事件处理程序中调用Pulse
并在同步方法中调用Wait
。但请确保在您进入Wait
状态之前未发生事件... =)
祝你好运!