多播委托订阅/取消订阅按钮单击事件

时间:2012-03-13 21:19:10

标签: c# .net winforms delegates event-handling

我想订阅并取消订阅ToolStripButton的{​​{1}}事件,使用全局声明的委托作为已解释的in this SO question and subsequent answers。我在我的班级

中全局声明了以下委托
Click

然后我将此委托设置为按如下方式保存方法

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

2 个答案:

答案 0 :(得分:2)

不是订阅和取消订阅点击事件,而是从点击事件中调用cancelTask

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

订阅并取消订阅cancelTask

cancelTask += Whatever;
cancelTask -= Whatever;

答案 1 :(得分:0)

我对你想要完成的事情更加好奇。也许有一种方法可以在不使用全局多播委托的情况下做事。