6

次のようなことをしても安全ですか?

private void MyFunction()
{
    DispatcherTimer timer = new DispatcherTimer();
    timer.Interval = new TimeSpan(0, 0, 1);
    timer.Tick += (object sender, object e) =>
    {
        timer.Stop();
        // Some code here
    };
    timer.Start();
}
4

3 に答える 3

6

マットは、匿名メソッドをアタッチする方法では、それをデタッチする簡単な方法がないという点を指摘します。必要に応じてデタッチできるようにするために使用できる一般的なパターンを次に示します。

private void MyFunction()
{
    DispatcherTimer timer = new DispatcherTimer();
    timer.Interval = new TimeSpan(0, 0, 1);
    EventHandler eh = null;
    eh = (object sender, object e) =>
    {
        timer.Tick -= eh;
        timer.Stop();
        // Some code here
    };

    timer.Tick += eh;
    timer.Start();
}

ただし、この特定のケースでは、タイマーが停止するとすぐに収集可能になるため、元のコードの動作に問題はありません。

于 2011-10-22T16:25:25.870 に答える
4

はい。タイマーが1回起動します。

于 2011-10-21T23:12:11.740 に答える
2

編集:コメントに基づいて私の答えを言い換えます。あなたが与えた状況では、はい、匿名のデリゲートを使用することは完全に安全です。

匿名デリゲートを追加し、それをデタッチしないと、クラスがガベージコレクションされなくなる可能性がある状況がいくつかあります(たとえば、匿名デリゲートをシングルトンにアタッチする)。イベントハンドラーをデタッチする必要がある場合と必要でない場合については、この回答を参照してください。

于 2011-10-22T14:50:55.217 に答える