1

イベント発生後にメインスレッドで AC# メソッドを呼び出しています。次に、最初のイベントが同じメソッドでビジーである間に、別のイベントがこの同じメソッドを起動しています。そのため、デバッグ中に、同じスレッドの同じメソッドの呼び出しスタックに 2 行が表示されます。

同じ方法で最初のイベントの準備が整うまで、2 番目のイベントが待機するのをどのように妨げることができますか。lock() を試していますが、同じスレッドをブロックしません。AutoResetEvent は待機できますが、同じスレッドで待機します。

誰かがヒントを持っていますか?ありがとう。

4

2 に答える 2

2

あなたの問題はによって引き起こされApplication.DoEvents()ます。このメソッドには用途がありますが、危険です。理由の 1 つに遭遇しました: イベントへの再入可能な呼び出し。

だから、試してみてください

  1. DoEvents() を削除して回避します。
  2. または、すべてのイベントハンドラーを再入可能または再入可能にします。たとえば、閉じるボタンでどのようなシナリオが考えられるかを批判的に見てみましょう。簡単なトリックは次のとおりです。
private bool busy = false;    
private void MyHandler(sender s, EventArgs e)
{
  if (busy)
    return;   // giving up, no queuing

  busy = true;
  // code
  busy = false;  // maybe in a finally clause
}
于 2012-05-26T19:05:34.617 に答える
0

MethodImplAttribute属性でメソッドをマークできます。

例:

[MethodImpl(MethodImplOptions.Synchronized)]
void Method()
{
   ....
}

ドキュメント ( MSDN ):

MethodImplOptions.Synchronized

一度に 1 つのスレッドだけがメソッドを実行できることを指定します。静的メソッドは型をロックしますが、インスタンス メソッドはインスタンスをロックします。インスタンス関数のいずれかで実行できるスレッドは 1 つだけであり、クラスの静的関数のいずれかで実行できるスレッドは 1 つだけです。

于 2012-05-26T15:01:10.347 に答える