阻止功能并等待事件C#

时间:2012-07-21 06:01:19

标签: c# events .net-4.0 thread-synchronization

我想阻止一个函数并等待一个事件然后继续,在我的例子中,当我点击一个按钮时我想要的伪代码:

  • 弹出消息框
  • 等待事件点击datagridview
  • 弹出messagebox2
  • 等待事件点击datagridview
  • 弹出一个是/否消息框
  • 执行另一项功能

但实际代码不等待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();
        }
    }

提前致谢

2 个答案:

答案 0 :(得分:3)

  

我想阻止一个函数并等待一个事件然后继续

基本上不是事件驱动的GUI如何工作。你不应该阻止UI线程 - 它将阻止屏幕刷新,窗口被拖动,关闭等。

相反,您应该禁用在进行其他处理时不希望可用的所有操作,并且当事件发生时,回调到UI线程(例如,使用Control.Invoke)重新启用相关的控制,并继续你的逻辑。

使用异步方法,C#5将使这一切变得更加容易,因为您可以编写同步代码,“等待”操作完成而不会阻塞线程 - 但是您仍然需要确定禁用/启用的内容当

答案 1 :(得分:1)

您可以尝试添加同步对象,并在同步对象上使用Monitor's方法WaitPulse。也就是说,您需要在事件处理程序中调用Pulse并在同步方法中调用Wait。但请确保在您进入Wait状态之前未发生事件... =)
祝你好运!