【问题标题】:Using a class instance created in one method from an another method使用在一个方法中从另一个方法创建的类实例
【发布时间】:2015-03-02 11:04:16
【问题描述】:

我已经在这里摸索了几天 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 人员,我可以让会话保持活动状态直到应用程序关闭吗?在同一个表单上多次“打开会话”的任何智能方式?

我觉得很难解释。

示例:
我有一个代码/计时器,它刷新位于 Form 1 (Objectlist1) 上的列表
它每 5 秒滴答一次。

这是使用的代码:

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) 让它能够在整个表单中保持活力,或者?

大家有什么建议吗?

【问题讨论】:

    标签: vb.net winscp winscp-net


    【解决方案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)
    

    【讨论】:

    • Ey Martin,是的,我以为是这样的。到目前为止,我已经完成了您建议的所有操作,但是 .Open(mySessionOptions) 出现在未声明的其他表单上。看,在我登录的第一个中,一切正常。在其他形式中,新会话有效,但由于某种原因未声明 mySession.Open(mySessionOptions)。我在模块中遗漏了什么吗?
    • 好吧,那么mySession 必须是项目范围的。见Declare global variables in Visual Studio 2010 and VB.NET
    • 项目范围!有些东西可能会奏效。好的,我会检查一下,看看情况如何;D 谢谢 Prikryl!
    • 是的,效果不太好。使用全局变量只会呈现“未将对象引用设置为对象的实例”。在它是“会话未打开”之前。根据您的指示上课,我必须使用 Module ; Friend Module Module1 Public mySession 作为会话结束模块,因为如果不是,则“会话”呈现为未声明。 Idk Martin,它似乎不能很好地协同工作。程序启动的唯一原因是“Public Sub Open”的原因,它只能在 Winform 上使用 1 次。要么是我得到了错误的信息,要么是其他事情搞砸了。
    • 我假设您没有删除特定于表单的mySession,因此它隐藏了全局。
    猜你喜欢
    • 1970-01-01
    • 2018-08-11
    • 2011-12-17
    • 1970-01-01
    • 2011-12-30
    • 1970-01-01
    • 1970-01-01
    • 2015-06-10
    • 2014-11-05
    相关资源
    最近更新 更多