我使用SSH.NET在.Net-Applications中创建SSH隧道。在我的ConsoleApplication / Windows-Service中,这个库可以正常工作。
现在我编写了一个WPF应用程序,它创建了一个SSH隧道来远程访问MySQL数据库。 我可以访问数据库并执行我的SQL语句。
但是如果我在断开与数据库的连接后尝试关闭隧道,我首先得到一个SocketException:10004通过调用WSACancelBlockingCall来中断阻塞操作 然后是几个例外:
我使用以下代码打开/关闭隧道:
public class SSHTunnelBuilder
{
private SshClient client;
private ForwardedPort port;
public SSHTunnelBuilder()
{
}
public void CloseTunnel()
{
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;
if (this.client != null)
{
if (this.client.IsConnected)
{
this.client.Disconnect();
}
this.client.Dispose();
this.client = null;
}
}
public void OpenTunnel()
{
if (this.client == null)
{
this.client = new SshClient("host", "usr", "pwd");
}
if (!this.client.IsConnected)
{
this.client.Connect();
}
if (this.port == null)
{
this.port = new ForwardedPortLocal("XXX.XXX.XXX.XXX", 10000, "YYY.YYY.YYY.YYY", 3306);
}
if (!this.client.ForwardedPorts.Contains(this.port))
{
this.client.AddForwardedPort(this.port);
}
if (!this.port.IsStarted)
{
this.port.Start();
}
}
}
SSHTunnelBuilder在TASK中使用,如下所示:
private void SomeMethod()
{
Task.Factory.StartNew(
new Action(() =>
{
SSHTunnelBuilder ssh = new SSHTunnelBuilder();
try
{
ssh.OpenTunnel();
// Do something
ssh.CloseTunnel();
ssh.Dispose();
ssh = null;
}
catch (Exception e)
{
ssh.CloseTunnel();
ssh.Dispose();
ssh = null;
}
}));
}
有人可以向我解释如何摆脱这些例外吗?