2015-11-09 20 views
4

我是C#TPL和DataFlow的新手,我正在努力研究如何實現TPL DataFlow TransformManyBlock。我正在將其他代碼翻譯成DataFlow。我(簡體)原代碼是這樣的:如何用代理構建TransformManyBlock

private IEnumerable<byte[]> ExtractFromByteStream(Byte[] byteStream) 
{ 
    yield return byteStream; // Plus operations on the array 
} 

而在另一種方法,我會這樣稱呼它:

foreach (byte[] myByteArray in ExtractFromByteStream(byteStream)) 
{ 
    // Do stuff with myByteArray 
} 

我試圖創建一個TransformManyBlock產生多個小陣列(實際上是數據包)來自較大的輸入數組(實際上是一個二進制流),因此輸入和輸出都是byte[]類型。

我嘗試了以下的內容,但我知道我錯了。我想用和前面相同的函數構造這個塊,並且圍繞它包裝TransformManyBlock。我收到了一個錯誤「The call is ambiguous ...」

var streamTransformManyBlock = new TransformManyBlock<byte[], byte[]>(ExtractFromByteStream); 

回答

5

編譯器在推斷類型時遇到了麻煩。您需要顯式指定委託類型來澄清對呼叫:

var block = new TransformManyBlock<byte[], byte[]>(
    (Func<byte[], IEnumerable<byte[]>>) ExtractFromByteStream); 

或者你可以使用lambda表達式在調用這個方法:

var block = new TransformManyBlock<byte[], byte[]>(
    bytes => ExtractFromByteStream(bytes)); 
+0

謝謝。這正是我所追求的。你知道這些方法之一是否比其他方法更可取? –

+2

@MattL第一個效率稍高,第二個稍微可讀。所以這取決於你決定哪個更重要。 – svick

+0

@svick效率一路。非常感謝。對於我自己的學習,你有任何可以分享的鏈接,可以進一步解釋這一點嗎? –