2013-07-25 1 views
0

Ну у меня есть некоторые подводные лодки, как:Автоматический перезапуск, а затем продолжить Sub в VB.NET

Private Sub somesub() «Processses, которые достигают 900 Мб в 1 час и половина End Sub

Я хочу перезапустить приложение, утилизировать память, а затем вернуться туда, где я был.

Точно, у меня есть приложение, которое добавляет контакты и хорошо. Он достигает 900 МБ, когда добавлено 2000 контактов ... Я хочу остановить каждые 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 

Что я могу сделать? Благодаря!

+0

возможный дубликат [ перезапуск приложения с одним экземпляром] (http://stackoverflow.com/questions/745447/restarting-a-single-instance-application) – ElektroStudios

ответ

1

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

пару очков.

  1. Я переместил вашу декларацию pUser и ничего не сделал, когда закончил. Таким образом, объект немедленно помечен для удаления .. вы можете получить более 200 оборотов из этого с изменением структуры .. но это может быть немного медленнее.

  2. Вам потребуется какая-то перезагрузка для вашего списка. Я предполагаю, что вы не включили его как часть своего образца для краткости.

  3. Я изменил ваш цикл foreach на структуру цикла for. Это позволяет вам отслеживать вашу позицию в списке. В результате мне пришлось создать новый oUser, так как вы повторяли, что в foreach и не указали его тип, вам нужно будет исправить эту часть кода.

  4. Очевидно, что я не скомпилировал приведенный ниже код, но он должен дать вам достойное начало в том, что вы пытаетесь сделать.

  5. Будьте осторожны с Process.Start, так как вы можете установить текущий процесс для запуска другого процесса и дождаться завершения этого процесса до выхода из текущего, и это будет очень очень очень плохо и действительно вызовет исключение OutOfMemoryException быстро. Вы должны позволить текущему процессу запускать следующий экземпляр, а затем не проверять, удалось ли ему запустить его. Exit. Или если вы использовали команду restart в своих комментариях, используйте это. Метод процесс нерест может делать то, что Ваше желание более эффективно, потому что ваш начать новый процесс на компьютере и давая старый один сборщик мусора (таким образом, освобождая ресурсы он использует.

    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