【问题标题】:WPF Create global WinSCP sessionWPF 创建全局 WinSCP 会话
【发布时间】:2015-12-14 16:36:00
【问题描述】:

我正在尝试创建一个全局 WinSCP 会话。我需要在我的应用程序的两个不同位置使用会话到GetFiles 和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);
        }
    }
}

【问题讨论】:

    标签: c# wpf global-variables winscp winscp-net


    【解决方案1】:

    通过隐式调用Session.Dispose method 来处理会话的是using statement。这就是它的目的。但是您不希望它在您的情况下。删除它。

    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 方法来处理Session 实例。

    例如,您可以覆盖OnClosed method(或处理Closed event):

    protected override void OnClosed(EventArgs e)
    {
        GlobalSession.Dispose();
        base.OnClosed(e);
    }
    

    虽然你真的应该在后台线程上进行任何会话打开/文件传输。不在 GUI 线程上。但这是一个不同的话题。

    【讨论】:

    • 哈哈,谢谢,是的,所有的转账都在后台,我只是把我的代码放在这里,所以你不必看到所有 1000 行 :)
    【解决方案2】:

    您的using 语句将在会话超出范围后立即处理它:

     using (Session session = new Session())
     {
        // Connect
        session.Open(sessionOptions);
        return session;
     } //<-------------------- SESSION DISPOSED HERE!!
    

    当所有对象都完成会话后,如有必要,请删除using 并手动调用Dispose()

    【讨论】:

      猜你喜欢
      • 2022-06-11
      • 2018-02-14
      • 1970-01-01
      • 2019-06-15
      • 2014-03-17
      • 1970-01-01
      • 1970-01-01
      • 2015-08-31
      • 2011-12-03
      相关资源
      最近更新 更多