C# SSH.NET SocketException:10004对WSACancelBlockingCall的调用中断了阻塞操作

C# SSH.NET SocketException:10004对WSACancelBlockingCall的调用中断了阻塞操作,c#,wpf,ssh-tunnel,ssh.net,C#,Wpf,Ssh Tunnel,Ssh.net,我使用SSH.NET在.NET应用程序中创建SSH隧道。在我的控制台应用程序/Windows服务中,此库的工作方式与预期一样 现在,我编写了一个WPF应用程序,它创建了一个SSH隧道来远程访问MySQL数据库。 我可以访问数据库并很好地执行SQL语句 但是,如果在断开与数据库的连接后尝试关闭隧道,我首先会得到一个SocketException:10004对WSACancelBlockingCall的调用中断了阻塞操作 接下来还有几个例外: SocketException:10053主机中的软件

我使用SSH.NET在.NET应用程序中创建SSH隧道。在我的控制台应用程序/Windows服务中,此库的工作方式与预期一样

现在,我编写了一个WPF应用程序,它创建了一个SSH隧道来远程访问MySQL数据库。 我可以访问数据库并很好地执行SQL语句

但是,如果在断开与数据库的连接后尝试关闭隧道,我首先会得到一个SocketException:10004对WSACancelBlockingCall的调用中断了阻塞操作 接下来还有几个例外:

  • SocketException:10053主机中的软件停止了已建立的连接,可能是因为数据传输超时或协议错误
  • Renci.SshNet.Common.SshConnectionException:错误的数据包长度XXX(XXX是一个随机整数)
  • Renci.SshNet.Common.SshConnectionException:客户端未连接
我使用以下代码打开/关闭隧道:

公共类SSHTunnelBuilder
{
私人SshClient客户端;
私人转运港;
公共SSHTunnelBuilder()
{
}
公众隧道(
{
if(this.port!=null&&this.port.IsStarted)
{
this.port.Stop();
}
if(this.client!=null&&this.client.ForwardedPorts.Contains(this.port))
{
this.client.RemoveForwardedPort(this.port);
}
this.port=null;
如果(this.client!=null)
{
if(this.client.IsConnected)
{
this.client.Disconnect();
}
this.client.Dispose();
this.client=null;
}
}
公共露天隧道(
{
if(this.client==null)
{
this.client=新的SshClient(“主机”、“usr”、“pwd”);
}
如果(!this.client.IsConnected)
{
this.client.Connect();
}
如果(this.port==null)
{
this.port=newforwardedportlocal(“XXX.XXX.XXX.XXX”,10000,“YYY.YYY.YYY”,3306);
}
如果(!this.client.ForwardedPorts.Contains(this.port))
{
this.client.AddForwardedPort(this.port);
}
如果(!this.port.istarted)
{
这个.port.Start();
}
}
}
SSHTunnelBuilder用于以下任务:

private void SomeMethod()
{  
Task.Factory.StartNew(
新操作(()=>
{
SSHTunnelBuilder ssh=新的SSHTunnelBuilder();
尝试
{
ssh.OpenTunnel();
//做点什么
ssh.CloseTunnel();
ssh.Dispose();
ssh=null;
}
捕获(例外e)
{
ssh.CloseTunnel();
ssh.Dispose();
ssh=null;
}
}));
}

有人能给我解释一下如何消除这些异常吗?

明显的问题:在控制台应用程序和WPF应用程序中使用SSH隧道的方式有什么不同?考虑一下,我已经试过了。没有成功。在这两个应用程序中,我与相同的MySQL服务器通信,甚至在相同的表上使用相同的语句。该服务每小时运行一次自动数据库同步。WPF桌面应用程序用于查看和编辑。我在两个应用程序中使用了相同的SSHTunnelBuilder类。我还尝试了不带任务的SomeMethod()的同步版本,因此ssh引用将存在于UI线程中。-->没有变化,那么就不会真正关闭数据库。尝试找出套接字异常所抱怨的阻塞操作的原因。