多演员代理订阅/取消订阅按钮单击事件

本文关键字:按钮 单击 事件 取消 代理 | 更新日期: 2023-09-27 18:27:53

我想使用全局声明的委托订阅和取消订阅ToolStripButtonClick事件,如本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 s。

多演员代理订阅/取消订阅按钮单击事件

与其订阅和取消订阅点击事件,不如从点击事件调用cancelTask

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

以及订阅和取消订阅cancelTask

cancelTask += Whatever;
cancelTask -= Whatever;

我会对您想要实现的目标更加好奇。也许有一种方法可以在不使用全局多播委派的情况下完成任务。