2012-03-13 125 views
0

我想使用全球聲明的代表in this SO question and subsequent answers訂閱和取消訂閱ToolStripButtonClick事件。我有以下的代表在我班上全局聲明多播代表訂閱/取消訂閱按鈕單擊事件

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

我然後設置這個委託如下

StopTask cancelTask = UtilsTPL.CancelRunningProcess; 

舉行方法,其中公共類UtilsTPLCancelRunningProcess被定義爲

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。

+1

事件綁定到特定類型的委託:在'Click'的情況下,它是一個基本的'EventHandler',即一個'Action ',而不是'Action '。 – 2012-03-13 21:42:28

回答

2

相反訂閱,並從單擊事件退訂,從你的點擊事件

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

打電話給你cancelTask和訂閱,並從cancelTask

cancelTask += Whatever; 
cancelTask -= Whatever; 
+0

這應該是'處理程序(ref this,_task,_cancelSource)'以匹配委託類型,並且鍵入'ref this'會讓我的脊柱發抖。 – 2012-03-13 21:46:01

+0

是的,MainForm是一個引用類型;因此,論點可能不應該是'ref'。可能它也不適用於多播委託。 – 2012-03-13 21:56:40

+0

所以你說這是行不通的?我目前看不到這種樹木 - 這是漫長的一天。任何進一步的建議,將不勝感激。 – MoonKnight 2012-03-13 22:03:08

0

退訂我更好奇了一下關於你想要完成的事情。也許有一種方法可以在不使用全局多播代理的情況下完成任務。

+0

我在問題的開頭說明了這一點。謝謝。 – MoonKnight 2012-03-13 21:46:23