【问题标题】:The operation is not allowed on non-connected sockets在未连接的套接字上不允许该操作
【发布时间】:2017-05-03 17:41:23
【问题描述】:

我是异步编程的新手,我认为这可能是我的问题,但查看其他答案,我不确定是否找到适合我情况的答案。

我正在尝试使用 TcpClient 连接到服务器和端口并从中获取流,但我收到以下错误:

在未连接的套接字上不允许该操作

我只能假设这是因为异步连接

我的另一个困惑点是 TcpClient 似乎有一个 不仅连接 ConnectAsync TcpClient Connect method,而且连接 不会生成 TcpClient 不包含的错误 连接的定义。

还有我尝试使用的这个文档,似乎GetStream 是答案,但我不确定我是否正确实施它。 .NET Core TcpClient

using (var irc = new TcpClient())
{
    irc.ConnectAsync(_server, _port);

    using (var stream = irc.GetStream())
    using (var reader = new StreamReader(stream))
    using (var writer = new StreamWriter(stream))
    {
      // Rest of code
    }
}

【问题讨论】:

  • 您忘记等待以完成连接。问题不是由ConnectAsync引起的,而是因为在客户端有机会连接之前调用GetStream引起的

标签: c# .net-core tcpclient


【解决方案1】:

代码不会等待连接完成。问题不是由 ConnectAsync 引起的,而是因为在客户端有机会连接之前调用 GetStream 引起的

只需将您的代码更改为:

await irc.ConnectAsync(_server, _port);

要使用await,您必须将封闭方法的签名更改为async Taskasync Task<something>(如果它返回结果):

async Task MyMethodAsync()
{
    ...
    await irc.ConnectAsync(_server, _port);
    ...
}

async Task<string> MyMethodAsync()
{
    ...
    await irc.ConnectAsync(_server, _port);
    ...
    return result;
}

不要尝试使用.Wait().Result 阻止任何异步调用。这将阻塞原始线程并可能导致死锁。如果你最终阻塞了异步方法,那么调用它就没有意义了。

也不要使用async void 签名。这仅保留给异步事件处理程序。不返回结果的方法应该有一个async Task 签名

【讨论】:

  • 啊,谢谢,这让await 现在对我来说更有意义了。我一直很难掌握异步方法,但现在我对它的理解要好得多。
猜你喜欢
  • 1970-01-01
  • 2020-06-07
  • 2017-12-05
  • 1970-01-01
  • 2023-01-12
  • 2011-09-22
  • 1970-01-01
  • 2019-10-09
相关资源
最近更新 更多