我是异步编程的新手,我认为这可能是我的问题但是查看其他答案,我不确定是否找到了适合我情况的编程。
我正在尝试使用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
}
}
答案 0 :(得分:2)
代码没有等待以完成连接。这个问题不是由ConnectAsync引起的,因为GetStream是在客户端有机会连接之前调用的。
只需将您的代码更改为:
await irc.ConnectAsync(_server, _port);
为了使用await
,如果它返回结果,您必须将封闭方法的签名更改为async Task
或async 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
签名