提问人:Fadzii 提问时间:1/30/2023 更新时间:1/31/2023 访问量:460
C# 套接字 ReceiveAsync 方法错误无重载
C# Sockets ReceiveAsync No overload for method error
问:
我正在 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 的官方文档中,它们传递了相同的参数。
任何帮助都非常感谢:)
答:
这个错误有点误导。虽然没有采用 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>
虽然,即使在您修复该问题之后,您仍会收到编译器错误警告,您不能隐式地将 转换为 ,因为始终返回 .int
bool
ReceiveAsync()
int
您可以将该行更改为:
var received = await client.ReceiveAsync(new ArraySegment<byte>(_buffer), SocketFlags.None); //This is the line with the error
ArraySegment<T>
结构不会复制基础数组。它只是引用数组的一部分的一种方式。如果不将范围传递给构造函数,则它引用整个数组。
评论