0

免責事項(完全に編集/削除可能)

私は宿題をしましたが、私の認識の限りでは、私が知りたいこと自体を見ることができません(これは少し驚くべきことですので、親切な魂が私を複製としてフラグを立てると確信しています-事前に謝罪を受け入れてください、ハハ)。

背景と予想される問題

Outlookを起動すると、CRMDynamicsから更新を実行しています。これにはしばらく時間がかかります。そこで、更新をスレッドに入れることにしました。想定どおりに機能しますが、リボンにボタンあり、ユーザーが手動で更新を呼び出すことができます。熱狂的なユーザーを予想して、元の更新が完了する前に誰かボタンをクリックし、あらゆる種類の排泄物がガス再分配装置に当たる可能性があることを認識しています。

推奨される解決策

それを避けるために、私は次のように私有財産を置きました。

private bool KeepYourPantsOn { get; set; }

上記のプロパティがtrue(更新スレッドを開始する直前に設定されている)である限り、必死のクリックはすべて無視されるか、落ち着いて有益な情報によって処理されます。

MessageBox.Show("Yes, yes... Updating still... Keep your pants on.");

ただし、スレッドが完了するとすぐに、プロパティを切り替えてfalse、ユーザーがOutlookを手動で更新できるようにします。

実装上の問題

私の悩みの種は、の値を切り替えるために呼び出すなどのメソッドがOnFinished見つからないことです。さらに、私はそれを解決する方法について提案された解決策を実際に見たことがありません(または、むしろ-私は解決策を認識していません-スレッドプログラミングの領域内の無知のために、それがそれであることに気付かずに解決策を見たかもしれません) 。WhenDoneKeepYourPantsOn

4

2 に答える 2

0

booltoをスレッドの最後の行として設定できるはずですfalse(または、スレッドがそうしている場合は、何かを待機するためにループバックする前の最後の行として)。

@Tudor に関するコメントに注意しvolatileてください - 念のため、実行してください。

于 2012-10-03T13:00:39.327 に答える
0

プロパティのバッキング ストアを作成して値を保持し、値lockを設定または取得するたびに を使用して、同時実行の問題が発生しないようにすることができます。その後、別のスレッドで処理を開始する場合は、値を にtrue設定し、メソッドを終了する前に値を に設定しますfalse

ユーザーがクリックすると、KeepYourPantsOnプロパティの値を確認し、メッセージが表示されない場合はメッセージを表示しますtrue

class YourClass
{
    private static readonly object _syncRoot = new object();
    private bool _keepYourPantsOn;

    public bool KeepYourPantsOn
    {
        get
        {
            lock(_syncRoot)
            {
                return _keepYourPantsOn;
            }
        }
        set
        {
            lock(_syncRoot)
            {
                _keepYourPantsOn = value;
            }
        }
    }

    private ThreadMethod()
    {
        KeepYourPantsOn = true; //signal that the update process is starting...
        // perform your logic
        KeepYourPantsOn = false; //signal that the update process is finished
    }

    public ManualUpdate()
    {
        if(KeepYourPantsOn)
            MessageBox.Show("Yes, yes... Updating still... Keep your pants on.");
        else
            Update();
    }
}
于 2012-10-03T14:39:31.550 に答える