C# 自定义异步/等待

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(

我正在尝试重新编写一个异步TCP类,我曾经编写该类实现了新的wait/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(..)


首选哪一种?

使用该方法,并将处理异步性的工作转移到基类库中。还有一个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方法。