Multi-Cast Delegate Подписаться / Отписаться на событие Click Click - PullRequest
0 голосов
/ 14 марта 2012

Я хочу подписаться и отписаться от события ToolStripButton Click, используя глобально объявленного делегата, как указано в этом вопросе SO и последующих ответах . У меня есть следующий делегат, объявленный глобально в моем классе

private delegate void StopTask(ref MainForm _mainForm, 
    Task _task, CancellationTokenSource _cancelSource);

Затем я установил этот делегат для хранения метода следующим образом

StopTask cancelTask = UtilsTPL.CancelRunningProcess;

где в публичном классе UtilsTPL, CancelRunningProcess определяется как

public static void CancelRunningProcess(ref MainForm _mainForm, Task _task, 
    CancellationTokenSource _cancelSource)
{
    // Some really amazing code...
}

Затем я пытаюсь добавить делегата к моему ToolStripButton событию щелчка, как это (и также отменить подписку, как показано)

mainForm.stopButton.Click += cancelTask;
mainForm.stopButton.Click -= cancelTask;

Это явно не работает, так как есть явное несоответствие типов.

Как подписать / отписаться от постоянного представителя cancelTask на событие нажатия кнопок? Спасибо за ваше время.

Примечание: я делаю это так, чтобы кнопку можно было повторно использовать для отмены множества различных Task с.

Ответы [ 2 ]

2 голосов
/ 14 марта 2012

Вместо того, чтобы подписываться и отписываться от события click, звоните по номеру cancelTask из вашего события click

private void stopButton_Click(object sender, EventArgs e)
{
    var handler = cancelTask;
    if (handler != null) {
        handler(this, _task, _cancelSource);
    }
}

, а также подписывайтесь и отписывайтесь от cancelTask

cancelTask += Whatever;
cancelTask -= Whatever;
0 голосов
/ 14 марта 2012

Мне было бы немного любопытнее, что вы пытаетесь достичь. Возможно, есть способ сделать что-то без использования глобального многоадресного делегата.

...