C# 自定义异步/等待
我正在尝试重新编写一个异步TCP类,我曾经编写该类实现了新的wait/async构造 到目前为止我有C# 自定义异步/等待,c#,C#,我正在尝试重新编写一个异步TCP类,我曾经编写该类实现了新的wait/async构造 到目前为止我有 public async void Send(byte[] data) { await SendAsync(data); } private Task SendAsync(byte[] data) { var stream = _tcpClient.GetStream(); return new Task(
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(..)
首选哪一种?使用该方法,并将处理异步性的工作转移到基类库中。还有一个ReadAsync for代码未包含在上述示例中。使用该方法,并将处理异步性的工作转移到基类库中。还有一个ReadAsync for代码未包含在上述示例中。您不是在启动任务,这是故意的吗?有什么奇怪的?这是一种很正常的方式。我只建议将
流
作为一个参数传递给任务。@Erno否。我该如何启动它?@ie似乎有很多不同的方式来实现该模式,对此我一直持怀疑态度。akton使用BCL方法进行此操作是正确的,但是:如果必须手动执行,它可能是这样的:-但是不要使用它,因为存在BCL方法!你不是在开始这项任务,是故意的吗?还有什么气味奇怪?这是一种很正常的方式。我只建议将流
作为一个参数传递给任务。@Erno否。我该如何启动它?@ie似乎有很多不同的方式来实现该模式,对此我一直持怀疑态度。akton使用BCL方法进行此操作是正确的,但是:如果必须手动执行,它可能是这样的:-但是不要使用它,因为存在BCL方法!我懂了。如果我调用WriteAsync而不使用wait
关键字,那么它仍然是异步的吗?它将返回一个Task
对象,您可以手动检查它。如果希望在返回结果之前阻止调用,请使用非异步方法。或者,为旧的异步实现尝试BeginWrite…EndWrite和BeginRead…EndRead方法。如果我调用WriteAsync而不使用wait
关键字,那么它仍然是异步的吗?它将返回一个Task
对象,您可以手动检查它。如果希望在返回结果之前阻止调用,请使用非异步方法。或者,对于较旧的异步实现,尝试使用BeginWrite…EndWrite和BeginRead…EndRead方法。