非连接套接字上不允许该操作

时间:2017-05-03 09:36:25

标签: c# .net-core tcpclient

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

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

  

非连接套接字上不允许进行操作

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

  

对我来说另一个困惑点是TcpClient似乎有一个   不仅要连接ConnectAsync TcpClient Connect method,还要连接它   不会使用TcpClient不包含的错误构建   Connect的定义。

还有我尝试使用的这个文档,似乎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
    }
}

1 个答案:

答案 0 :(得分:2)

代码没有等待以完成连接。这个问题不是由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;
}

DON&#39; T 尝试阻止使用.Wait().Result的任何异步调用。这将阻止原始线程并可能导致死锁。如果你最终阻止异步方法,那么调用异步方法是没有意义的。

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