我想订阅并取消订阅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
。
答案 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)
我对你想要完成的事情更加好奇。也许有一种方法可以在不使用全局多播委托的情况下做事。