0

さて、私は次のようないくつかのサブを持っています:

Private Sub somesub() '1時間半で900MBに達する処理 End Sub

アプリを再起動し、メモリを破棄して元の場所に戻したいです。

まさに、私は連絡先を追加するアプリを持っています.2000の連絡先が追加されると900MBに達します.200の連絡先ごとに停止したいので、私が言ったことと、テストしていないコード:

Imports SKYPE4COMLib

Public Class frmMain

Dim pUser As SKYPE4COMLib.User
        Dim contactos As Integer

        If contactos < 200 Then
            For Each oUser In ListBox1.Items

                pUser = oSkype.User(oUser)
                pUser.BuddyStatus = SKYPE4COMLib.TBuddyStatus.budPendingAuthorization
                oSkype.Friends.Add(pUser)
                contactos += 1
            Next
        Else
            'System.Windows.Forms.Application.Restart()
            'I need a code that continues where I was, here...
        End If
End Sub

End Class

私に何ができる?ありがとう!

4

1 に答える 1

1

あなたの問題を解決するかもしれないいくつかのコードを以下に書きました。確かにあなたの位置をファイルに保存する必要があり、ファイルが再度実行されると、その位置がリロードされます。

いくつかのポイント。

  1. pUser の宣言を移動し、完了したら何も設定しませんでした。このようにして、オブジェクトはすぐに破棄するようにマークされます..構造の変更により、これから 200 回転以上を得ることができます..しかし、少し遅くなる可能性があります.

  2. リストボックスをリロードする必要があります。簡潔にするために、サンプルの一部としてそれを含めなかったと思います。

  3. foreach ループを for ループ構造に変更しました。これにより、リスト内の位置を追跡できます。その結果、foreach でそれを繰り返していて、そのタイプをリストしなかったため、新しい oUser を作成する必要がありました。コードのその部分を修正する必要があります。

  4. 明らかに、私は以下のコードをコンパイルしていませんが、あなたがやろうとしていることについてまともなスタートを切るはずです.

  5. 現在のプロセスが別のプロセスを開始するように設定し、現在のプロセスを終了する前にそのプロセスが終了するのを待つことができるため、Process.Start に注意してください。現在のプロセスに次のインスタンスを開始させ、開始に成功したかどうかを確認せずに..終了する必要があります。または、コメントで再起動コマンドを使用した場合は、それを使用してください。プロセスの生成方法は、コンピューターで新しいプロセスを開始し、古いプロセスをガベージコレクションできるため、必要なことをより効果的に行うことができます(したがって、使用していたリソースを解放します.

    Imports SKYPE4COMLib
    
    Public Class frmMain
    
            'Put code here to load position from the file
            Dim startingPosition as Integer = 0
            If IO.File.Exists("c:\filename.txt")
                Using sr as New IO.StreamReader("c:\filename.txt")
                    sr.Read
                    StartingPosition = Convert.ToInteger(sr.ReadToEnd)
                    sr.Close
                End Using
            End If
            'Probably needs some code somewhere to reload your listbox
            Dim contactos As Integer
            Dim CurrentPosition as Integer = 0
            If contactos < 200 and StartingPosition < ListBox1.Items.Count Then
                For x as integer = StartingPosition to ListBox1.Items.Count - 1
                    Dim oUser as <YOURTYPEHERE> = Ctype(ListBox1.Items(x), <YOURTYPEHERE>)
                    Dim pUser As SKYPE4COMLib.User
                    pUser = oSkype.User(oUser)
                    pUser.BuddyStatus = SKYPE4COMLib.TBuddyStatus.budPendingAuthorization
                    oSkype.Friends.Add(pUser)
                    contactos += 1
                    pUser = Nothing  'set the garbage collection to collect this.
                    CurrentPosition = x
                Next
            Else
                'Save Your place to an external File, all your doing here is opening a file
                'and saving the index of where you are in the listbox.
                Using sw as New IO.StreamWriter("c:\filename.txt")
                     sw.Write(CurrentPosition)
                     sw.Close
                End Using
                'use the process namespace to have this app start the next copy of your app
                'be careful not to use WaitForExit or you will have two copies in memory...
                Process.Start("exename")
                'or if the command below exists.. use that.. I never have.
                'System.Windows.Forms.Application.Restart()
                'I need a code that continues where I was, here...
            End If
        End Sub
    End Class
    
于 2013-07-25T22:15:35.187 に答える