4

解決できない「呼び出し」の問題があります。できる限り詳しく説明するように努めますが、私はこれに慣れていないので、ご容赦ください。さらに情報が必要な場合はお知らせください。

プロンプトが表示されたときに、メイン スレッドで作成されたフォームの一連のチェック ボックスを無効にするバックグラウンド スレッドが実行されています。これを行うにはinvoke、デリゲートを使用して安全にクロススレッドする必要がありますが、それは間違っているに違いありません。要するに、デバッガーでこれをチェックすると、コードの ACTION 部分が 2 回実行されることがわかりますInvokeRequired。ACTION を , で囲むことでこれを回避できます。2回else実行されることはありませんがelse、メソッドをもう一度実行しようとします。

delegate void ManualCurtainShuttoffHandler();
public void ManualCurtainShutoff()
{
    if (InvokeRequired)                                    
    {
        Invoke(new ManualCurtainShuttoffHandler(ManualCurtainShutoff));           
    }
    // ACTION: Disable check boxes
}

メソッドを2回実行する理由を知りたいだけです。さらに情報が必要な場合はお知らせください。喜んで共有させていただきます。

4

2 に答える 2

11

を呼び出したInvokeからといって、現在のメソッドの実行は停止しません。迅速かつ簡単な解決策は、次のreturnように呼び出すことInvokeです。

delegate void ManualCurtainShuttoffHandler();
public void ManualCurtainShutoff()
{
    if (InvokeRequired)                                    
    {
        Invoke(new ManualCurtainShuttoffHandler(ManualCurtainShutoff));           
        return;
    }
    // ACTION: Disable check boxes
}

これにより、バックグラウンド スレッドで実行されているの残りの実行がスキップされますが、メイン スレッドでメソッドの新しいManualCurtainShutoff実行が促進されます。

于 2013-06-26T00:59:55.400 に答える
6

Invoke により、関数が別のスレッドで再度呼び出されます (それが目的です)。Invoke の呼び出しの後に return を追加する必要があります。アイデアは、関数が再度呼び出されることです (それはあなたが望むことです)、そのとき InvokeRequired は false になるため、アクションが実行されます。

編集:ダン、私が書き終えるまでに、私はパンチに殴られました。しかたがない!

于 2013-06-26T01:00:13.573 に答える