2015-03-02 4 views
0

Я уже несколько дней здесь участвовал в WinSCP, и все, что мне не хватает, - это правильно открыть сеанс.Использование экземпляра класса, созданного одним методом, из другого метода

Здесь инициализируется Session.

Private Sub Loginbutton_Click(sender As Object, e As EventArgs) Handles Loginbutton.Click 
    mySession = New Session() 
    Dim mySessionOptions As New SessionOptions 
    With mySessionOptions 
     .Protocol = Protocol.Sftp 
     .HostName = "192.168.0.247" 
     .UserName = "usr" 
     .Password = "pw" 
     .SshHostKeyFingerprint = "ssh-rsa KEY" 
    End With 
    Using mySession As Session = New Session 
     mySession.Open(mySessionOptions) 
    End Using 
    Form1.Show() 

    Me.Close() 
End Sub 

На следующей форме мне нужно использовать Session снова, и здесь я использовал

Public Sub Open(ByVal sessionOptions As SessionOptions) 
    Me.Show() 

    For Each i As RemoteFileInfo In mySession.ListDirectory("/Database/").Files 
     Objectlist1.Items.Add(i.Name) 
    Next 
    Objectlist1.Refresh() 
End Sub 

Это прямо здесь работает. Который, кажется, открывает сессию по мере необходимости на этом этапе. Но моя проблема возникает, когда мне нужно несколько раз открывать сеанс в той же форме, поскольку она не остается открытой сама по себе, если это возможно.

Что-нибудь еще, что мне нужно сделать в приложении, не может открыть сеанс, поскольку у меня не может быть несколько «открытых открытых открытых» по линии. Если здесь есть люди WinSCP, могу ли я заставить сеанс оставаться в живых, пока приложение не будет закрыто? Какой-нибудь умный способ «открытия сессии» несколько раз в одной форме?

Мне трудно объяснить.

Пример:
У меня есть тикер/таймер, который обновляет список, расположенный по форме 1 (Objectlist1)
И это помечает каждый 5.th второй.

Вот код используется:

Private Sub Timer2_Tick(sender As Object, e As EventArgs) Handles Timer2.Tick 

    Objectlist1.Clear() 
    For Each i As RemoteFileInfo In mySession.ListDirectory("/Database").Files 
     Objectlist1.Items.Add(i.Name) 
    Next 
End Sub 

Проблема заключается в том, хотя, когда он тикает, я получаю сессия не открывается, System.InvalidOperationException, который в основном .. Сессия не открыта .. Теперь, так как его открыли дальше в форме, мне, видимо, нужно открыть его снова? Или я могу что-то изменить в Public Sub Open(ByVal sessionOptions As SessionOptions), чтобы он мог оставаться в живых по всей форме или?

Любые советы здесь, ребята?

ответ

1

Во-первых, вы инициализации предположительно глобальное поле переменной или класса mySession, как вы получили посоветовали в Initialize Global Variable .Net:

mySession = New Session() 

Но тогда объявить локальную переменную с тем же именем (который скрывает глобальную один для остальные сферы):

Using mySession As Session = New Session  

и вы откроете местный один:

 mySession.Open(mySessionOptions) 

и немедленно закрыть его:

End Using 

Глобальный mySession является никогда открыт.

Вам нужно сделать:

mySession = New Session() 

    mySession.Open(mySessionOptions) 
+0

Еу Мартин, Да я думал, что это было что-то в этом роде. Я сделал все, что вы посоветовали до сих пор, но .Open (mySessionOptions) появляется на других формах, которые не объявлены. См. В первом, где я вошел в систему, все работает нормально. В других формах работает новая сессия, но mySession.Open (mySessionOptions) не объявляется по какой-либо причине. Я что-то пропустил в модуле? – PiperMp3

+0

Ну, тогда 'mySession' должен быть по всему проекту. См. [Объявить глобальные переменные в Visual Studio 2010 и VB.NET] (http://stackoverflow.com/questions/4529862/declare-global-variables-in-visual-studio-2010-and-vb-net) –

+0

Project- Широкий! Есть что-то, что может сработать. Хорошо, я проверю это и посмотрю, как это происходит: D Спасибо Прикрилу! – PiperMp3

Смежные вопросы