C# WPF创建全局WinSCP会话

C# WPF创建全局WinSCP会话,c#,wpf,global-variables,winscp,winscp-net,C#,Wpf,Global Variables,Winscp,Winscp Net,我正在尝试创建一个全局WinSCP会话。我需要在应用程序中的两个不同位置使用会话来获取文件和PutFiles。我的问题是,创建会话需要很长时间,这实际上会减慢应用程序的速度。我尝试了下面的方法来创建一个全局会话,但在运行它时,我得到了一个会话被释放的异常。是否可以在一个位置打开一个会话,并在应用程序中的任何地方使用它 /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public

我正在尝试创建一个全局WinSCP会话。我需要在应用程序中的两个不同位置使用会话来获取文件和PutFiles。我的问题是,创建会话需要很长时间,这实际上会减慢应用程序的速度。我尝试了下面的方法来创建一个全局会话,但在运行它时,我得到了一个会话被释放的异常。是否可以在一个位置打开一个会话,并在应用程序中的任何地方使用它

/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    Session GlobalSession;

    private static Session OpenSession()
    {
        SessionOptions sessionOptions = new SessionOptions
        {
            Protocol = Protocol.Sftp,

            HostName = @"server",
            UserName = "name",
            PortNumber = 22,
            SshHostKeyFingerprint = "ssh-rsa 2048 RSAKEY",
        };

        using (Session session = new Session())
        {
            // Connect
            session.Open(sessionOptions);
            return session;
        }
    }

    public MainWindow()
    {
        Session LocalSession = OpenSession();
        GlobalSession = LocalSession;
        InitializeComponent();
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        string path = "";
        try
        {
            // Upload files
            TransferOptions transferOptions = new TransferOptions();
            transferOptions.TransferMode = TransferMode.Binary;

            TransferOperationResult transferResult;

            RemoteDirectoryInfo subDirs = GlobalSession.ListDirectory(path);

            foreach(var sub in subDirs.Files)
            {
                MessageBox.Show(sub.ToString());
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine("Error: {0}", ex);
        }
    }

    private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        try
        {
            // Upload files
            TransferOptions transferOptions = new TransferOptions();
            transferOptions.TransferMode = TransferMode.Binary;

            TransferOperationResult transferResult;
            transferResult = GlobalSession.GetFiles(@"d:\toupload\*", "/home/user/File", false, transferOptions);

            // Throw on any error
            transferResult.Check();

            // Print results
            foreach (TransferEventArgs transfer in transferResult.Transfers)
            {
                Console.WriteLine("Upload of {0} succeeded", transfer.FileName);
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine("Error: {0}", ex);
        }
    }
}
一旦会话超出范围,using语句将立即处理会话:

 using (Session session = new Session())
 {
    // Connect
    session.Open(sessionOptions);
    return session;
 } //<-------------------- SESSION DISPOSED HERE!!
如果所有对象都已完成会话,请删除using并在必要时手动调用Dispose

一旦会话超出范围,using语句将立即处理会话:

 using (Session session = new Session())
 {
    // Connect
    session.Open(sessionOptions);
    return session;
 } //<-------------------- SESSION DISPOSED HERE!!
在所有对象完成会话后,如果需要,请删除using并手动调用Dispose

通过隐式调用来处置会话。这就是它的目的。但你不想让它出现在你的案件中。移除它

private static Session OpenSession()
{
    SessionOptions sessionOptions = new SessionOptions
    {
        Protocol = Protocol.Sftp,

        HostName = @"server",
        UserName = "name",
        PortNumber = 22,
        SshHostKeyFingerprint = "ssh-rsa 2048 RSAKEY",
    };

    // Connect
    session.Open(sessionOptions);
    return session;
}
并确保在不需要会话实例时,通过显式调用Session.dispose方法来处置该会话实例

例如,您可以覆盖或处理:

尽管您确实应该在后台线程上执行任何会话打开/文件传输。不在GUI线程上。但这是另一个主题。

是通过隐式调用来处理会话的。这就是它的目的。但你不想让它出现在你的案件中。移除它

private static Session OpenSession()
{
    SessionOptions sessionOptions = new SessionOptions
    {
        Protocol = Protocol.Sftp,

        HostName = @"server",
        UserName = "name",
        PortNumber = 22,
        SshHostKeyFingerprint = "ssh-rsa 2048 RSAKEY",
    };

    // Connect
    session.Open(sessionOptions);
    return session;
}
并确保在不需要会话实例时,通过显式调用Session.dispose方法来处置该会话实例

例如,您可以覆盖或处理:


尽管您确实应该在后台线程上执行任何会话打开/文件传输。不在GUI线程上。但这是一个不同的主题。

哈哈,谢谢,是的,所有的传输都在后台,我只是把代码放在这里,这样你就不必看到所有1000行了:哈哈,谢谢,是的,所有传输都在后台,我只是把代码放在这里,这样你就不必看到所有1000行了: