2012-09-04 154 views
0

我想重寫一個異步TCP類,我曾經寫過實現新的await/async構造。自定義異步/等待

到目前爲止,我有

public async void Send(byte[] data) 
    { 
     await SendAsync(data); 
    } 

    private Task SendAsync(byte[] data) 
    { 
     var stream = _tcpClient.GetStream(); 
     return new Task(()=>stream.Write(data, 0, data.Length)); 
    } 

但一些奇怪的氣味。這是做這件事的正確方法嗎?

編輯:
例如,我可以

public async void Send(byte[] data) 
    { 
     await SendAsync(data); 
     var stream = _tcpClient.GetStream(); 
     await Task.Factory.StartNew(()=>stream.Write(data, 0, data.Length)); 
    } 

或使用Task.Run(..)

這是優選的實現相同?

+0

你沒有開始任務,這是故意的嗎? –

+0

什麼味道奇怪?這是一個很正常的方式。我只會建議將'stream'作爲參數傳遞給任務。 –

+0

@Erno no。我將如何開始它? – kasperhj

回答

3

改爲使用Stream.WriteAsync()方法,並將處理異步性的工作轉移到基類庫上。還有一個ReadAsync代碼不包含在上面的例子中。

+0

我明白了。如果我不帶'await'關鍵字調用WriteAsync,它會不會是異步的? – kasperhj

+0

它會返回一個'Task <>'對象,你可以手動檢查它。如果您希望呼叫阻塞直到返回結果,請使用非異步方法。或者,爲舊的異步實現嘗試BeginWrite ... EndWrite和BeginRead ... EndRead方法。 – akton