0

ユーザーがボタンを押したときに、この小さなコンテキスト メニューを使用したいと考えています。

private ContextMenuStrip TaskMenu()
{
    ContextMenuStrip Result = new ContextMenuStrip();
    Result.Items.Add("Select task to start:");
    Result.Items.AddRange(
        System.IO.Directory.GetFiles("C:\\Settings\\Tasks", true), "*.tsk")
            .Select(qF => new ToolStripMenuItem(System.IO.Path.GetFileNameWithoutExtension(qF)) { Tag = qF, Checked = qF == this.TaskFile })
            .ToArray());
    Result.Items.Add("Cancel");
    Result.ItemClicked += new ToolStripItemClickedEventHandler(
        delegate(object s, ToolStripItemClickedEventArgs ev) { StartScan((string)ev.ClickedItem.Tag); });
    return Result;
}

しかし、イベントの購読を解除したことはないので、そうすべきではありません。右?

4

2 に答える 2

1

ここで問題はないはずです。Resultメソッド内で作成されるため、同じイベント ハンドラーを 2 回アタッチすることはできません。

への最後の参照Resultが範囲外になると、ガベージ コレクションの対象になります。このメソッドの外側に への永続的な参照が保持されていない限り、Resultガベージが収集されると、それとデリゲートへの参照の両方がクリーンアップされます。

于 2012-08-21T10:26:53.047 に答える
0

イベントの購読を解除したことはないので、そうすべきではありませんよね?

ある時点でイベントをアンフックする必要がある場合、これは正しいアプローチではありません。これを回避するには、ハンドラーへの参照を取得して、後でサブスクライブを解除できるようにします。

純粋にメモリ リークの観点から心配している場合は、心配しないでください。あなたContextMenuStripがGCされると、デリゲートもGCされます。

于 2012-08-21T10:34:58.273 に答える