2012-08-30 21 views
3

我有這段代碼(好吧,類似的東西)。使用泛型回調是不好的形式嗎?

private delegate void GenericCallback<T>(T Info); 

private void DoWork() 
{ 
    System.Threading.Thread Worker = new System.Threading.Thread(
      delegate() 
      { 
       TestMethod(TestMethodCallback<string>); 
      } 
    ); 
    Worker.Start(); 
} 

private void TestMethod(GenericCallback<string> Callback) 
{ 
    System.Threading.Thread.Sleep(1000); 
    if(Callback != null) 
    { 
     Callback("Complete"); 
    } 
} 

private void TestMethod(GenericCallback<int> Callback) 
{ 
    System.Threading.Thread.Sleep(1000); 
    if(Callback != null) 
    { 
     Callback(25); 
    } 
} 

private void TestMethodCallback<T>(T Info) 
{ 
    MessageBox.Show(Info.ToString()); 
} 

,讓我打電話給不同版本的基於參數的類型TestMethod,同時也讓我有一個回調方法。

這是一種糟糕的形式,還是一種公認​​的做法?

回答

7

看起來您可能正在尋找Action delegate type。這基本上就是你在這裏所得到的:一個通用的void返回委託類型。

+0

如果我想使用這樣的委託,該怎麼辦?如果我想使用這樣的委託,那麼我可以使用Action? – Tester101

+1

@ Tester101然後你需要一個'Action '。 –

+0

我認爲你必須使用'Action ',但我對委託子類型並不熟悉。 –

0

假設這將用於異步返回數據(否則,爲什麼不等待返回值?),這聽起來像你還沒有發現Task Parallel Library。特別是,Task<T>是實現類似回叫行爲的更普遍的方式。

例如:

private Task<int> TestMethod() 
{ 
    TaskCompletionSource<int> tcs=new TaskCompletionSource<int>(); 
    //do something asynchronous 
    //when asynchronous job is complete 
    //tcs.SetResult(25); 
    return tcs.Task; 

} 
+0

不是絕對必要的,因爲有六種方法來實現異步模型,但這確實是其中之一。 – KeithS

+0

真的很大。鑑於.NET 4.5(異步/等待)的發展,我會說'任務'取代所有其他執行這種操作的方式。 MS已經在大多數異步API中被批准。 – spender

+0

我會說這取決於。在某些情況下不應該使用任務(首先想到的是對觸及UI的方法進行異步調用;對此,有Control.BeginInvoke)。異步/等待是一個有用的快捷方式,但它並沒有使「長路」變得更加無效,就像「yield return」不會使創建IEnumerable實現成爲「錯誤」的方式一樣(Linq,for實例,具有迭代器類,由具有*熟悉*收益回報知識的人編寫)。 – KeithS

5

這樣的慣例,一些工作已經爲你做。 Action在這種情況下,Func應該返回一個值,是通用代表,就像這樣。一個優點是,如果我看到你的簽名:

private void TestMethod(GenericCallback<string> Callback) 

我要回去看看什麼GenericCallback<string>是。如果我看到:

private void TestMethod(Action<string> callback) 

我已經知道了。

1

完全沒問題。在這個非常簡單的情況下,最好指定一個字符串(因爲你的泛型沒有約束,只能作爲一個Object來處理,所以ToString()是你可以調用的極少數有用的東西之一,不管它是什麼你通過),但顯然這是示例代碼,所以有很多可接受的方法來做到這一點。 Action<>Func<>確實是一個很好的內建知道,但它們有一些缺點,比如減少自我文檔(可能很難說出Func應該做什麼,除了明顯的「取整數並返回一個整數「

相關問題