2015-12-14 3 views
1

Я пытаюсь создать глобальный сеанс WinSCP. Мне нужно использовать сеанс в двух разных местах в моем приложении до GetFiles и PutFiles. Моя проблема заключается в том, что для создания сеанса требуется очень много времени, чтобы замедлить работу приложения. Я попробовал то, что у меня есть, чтобы создать глобальный сеанс, но при запуске я получаю исключение для сеанса. Можно ли открыть сеанс в одном месте и использовать его повсюду в приложении.WPF Создать глобальный сеанс WinSCP

/// <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); 
     } 
    } 
} 

ответ

2

Это using statement, который предоставляет сеанс, неявно вызывающий Session.Dispose method. Это его цель. Но вы не хотите этого в вашем случае. Убери это.

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, явным вызовом метода Session.Dispose, когда он не нужен.

Вы можете, например, переопределить OnClosed method (или обрабатывать Closed event):

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

Хотя вы должны действительно делать какие-либо открытия сессии/передачи файлов в фоновом потоке. Не в потоке графического интерфейса. Но это другая тема.

+1

Ха-ха спасибо и да все передачи на фоне, я просто поставил здесь свой код, чтобы вам не нужно было видеть все 1000 строк :) – user3753693

2

Ваше using заявление избавляется сессию, как только он выходит из области видимости:

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

Снимите using и при необходимости позвонить Dispose() вручную, когда все ваши объекты закончили с сеансом

+0

Спасибо, это ответ на это ... – user3753693