2012-07-21 40 views
1

我想阻止功能,並等待一個事件,然後繼續,在我的情況下,僞代碼,我想有當我點擊一個按鈕:塊功能,並等待事件C#

  • 流行高達消息框
  • 等待在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(); 
     } 
    } 

在此先感謝

回答

1

你可以嘗試添加同步對象和使用Monitor's方法WaitPulse您的同步對象。那就是你需要在你的事件處理程序中調用Pulse,在你的同步方法中調用Wait。但要確保你的事件不會發生在你進入Wait狀態之前...... =)
祝你好運!

+0

所以你認爲阻止UI線程是合理的,直到發生什麼事情,用戶沒有辦法關閉應用程序,移動窗口等? – 2012-07-21 06:58:43

+0

如果我正確地獲取代碼,@geogeek不會阻止UI線程,因爲在單獨的線程上調用了「th_replace」和「th_remove」。我同意你,他不應該阻止UI線程。請糾正我,如果我錯了。 – 2012-07-21 07:04:07

+0

我錯過了一個工作在一個新的線程不同的UI的整個功能,在調試過程中我有一些用戶界面凍結,但現在它工作良好,當我使用一個新的線程 – geogeek 2012-07-21 10:24:33

3

我想阻止功能,並等待一個事件,然後繼續

這基本上沒怎麼事件驅動的GUI工作。你不應該阻止UI線程 - 它會停止刷新,窗口被拖動,關閉等。

而應當禁用所有不想在其他處理過程中可用的操作繼續,當事件發生時,回到UI線程(例如使用Control.Invoke)重新啓用相關控件,並繼續您的邏輯。

C#5將使異步方法更容易,因爲您可以編寫「等待」操作完成而不會阻塞線程的同步代碼 - 但您仍然需要計算禁用/啓用時。