C# 套接字 ReceiveAsync 方法错误无重载

C# Sockets ReceiveAsync No overload for method error

提问人:Fadzii 提问时间:1/30/2023 更新时间:1/31/2023 访问量:460

问:

我正在 C# 控制台应用程序中创建一个聊天应用程序,并且刚刚开始了解异步任务,而不仅仅是多线程,据我所知,多线程有点过时,最好使用异步。

我正在使用 Microsoft 关于套接字的官方文档作为我自己应用程序的指南,因为它们使用异步编程,但出现错误。

这是我收到错误的代码:

    private async Task handleClientsAsync(Socket server)
    {
        Byte[] _buffer = new Byte[1024];
        Socket client = await server.AcceptAsync();
        while (true)
        {
            bool received = await client.ReceiveAsync(_buffer, SocketFlags.None); //This is the line with the error
        }
    }

错误是:“方法'ReceiveAsync'没有重载接受'2'参数。这让我感到困惑,因为在 Microsoft 的官方文档中,它们传递了相同的参数。

任何帮助都非常感谢:)

C# 套接字异 async-await

评论


答:

2赞 Gabriel Luci 1/31/2023 #1

这个错误有点误导。虽然没有采用 2 个参数的重载,但有一些扩展方法可以。

System.Net.Sockets.SocketTaskExtensions 类中,某些重载已移至 .NET 4.7 和 .NET 4.7.1 之间的扩展方法。只要您在文件的顶部,就可以使用这些扩展方法。ReceiveAsync()using System.Net.Sockets;

那么为什么它不起作用呢?好吧,从来没有接受过普通字节数组的重载。但是有一个接受 Memory<Byte 的重载>并且该类有一个要隐式强制转换的运算符Memory<T>

该版本的重载未移动到扩展方法。唯一等效的接受 ArraySegment<Byte>,并且没有隐式强制转换运算符。所以你必须创造你自己。ArraySegment<T>ArraySegment<Byte>

虽然,即使在您修复该问题之后,您仍会收到编译器错误警告,您不能隐式地将 转换为 ,因为始终返回 .intboolReceiveAsync()int

您可以将该行更改为:

var received = await client.ReceiveAsync(new ArraySegment<byte>(_buffer), SocketFlags.None); //This is the line with the error

ArraySegment<T> 结构不会复制基础数组。它只是引用数组的一部分的一种方式。如果不将范围传递给构造函数,则它引用整个数组。