1

関数をブロックしてイベントを待ってから続行したいのですが、私の場合は、ボタンをクリックしたときに必要な擬似コードです。

  • メッセージボックスをポップアップします
  • datagridviewでイベントクリックを待つ
  • メッセージボックス2をポップアップします
  • 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();
        }
    }

前もって感謝します

4

2 に答える 2

3

関数をブロックしてイベントを待ってから続行したい

これは基本的に、イベント駆動型 GUI の仕組みではありません。UI スレッドをブロックしないでください。画面の更新、ウィンドウのドラッグ、クローズなどが停止します。

代わりに、他の処理が行われている間は利用したくないすべてのアクションを無効にする必要があります。イベントが発生したら、UI スレッドにコールバックし (例: を使用Control.Invoke)、関連するコントロールを再度有効にしてから、論理。

C# 5 では、非同期メソッドを使用すると、スレッドをブロックせずに操作が完了するのを「待機」する同期のようなコードを記述できるため、これが大幅に簡単になります。

于 2012-07-21T06:14:21.073 に答える
1

同期オブジェクトを追加して、Monitor のメソッドWaitを同期オブジェクトで使用することができPulseます。つまりPulse、イベント ハンドラーとWait同期メソッドで呼び出す必要があります。ただし、ステートに入る前にイベントが発生しないことを確認してくださいWait... =)
頑張ってください!

于 2012-07-21T06:13:40.290 に答える