2012-09-04 76 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