2013-07-16 2 views
0

Я прочитал другие сообщения об этом, но я все еще не могу заставить его работать правильно.BackgroundWorker freezes GUI

Всякий раз, когда мой BackgroundWorker начинает работать, моя функция API.CheckForUpdate заставляет графический интерфейс зависать. Я не могу нажимать ни на что. Он только замерзает на полсекунды, но этого достаточно заметить.

Как это исправить? Должен ли я погрузиться глубже в API.CheckForUpdate и запускать отдельные потоки в определенных операторах, или я могу просто использовать всеохватывающий поток, который обрабатывает это? API.CheckForUpdate ничего не ссылается на Form1.

Кроме того, я предполагаю, что Form1_Load не является лучшим местом для вызова RunWorkerAsync. Где лучшее место?

'Declarations 
Dim ApplicationUpdate As BackgroundWorker = New BackgroundWorker 

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    ApplicationUpdate.WorkerSupportsCancellation = True 
    ApplicationUpdate.WorkerReportsProgress = True 
    AddHandler ApplicationUpdate.DoWork, AddressOf ApplicationUpdate_DoWork 
    AddHandler ApplicationUpdate.ProgressChanged, AddressOf ApplicationUpdate_ProgressChanged 
    AddHandler ApplicationUpdate.RunWorkerCompleted, AddressOf ApplicationUpdate_RunWorkerCompleted 
    ApplicationUpdate.RunWorkerAsync() 
End Sub 

Private Sub ApplicationUpdate_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs) 
    'Check for an update (get the latest version) 
    Dim LatestVersion = API.CheckForUpdate 
End Sub 

Private Sub ApplicationUpdate_ProgressChanged(ByVal sender As Object, ByVal e As ProgressChangedEventArgs) 
    'Nothing here 
End Sub 

Private Sub ApplicationUpdate_RunWorkerCompleted(ByVal sender As Object, ByVal e As RunWorkerCompletedEventArgs) 
    'Work completed 
    MsgBox("Done") 
End Sub 
+0

Можете ли вы опубликовать метод CheckForUpdates? – OneFineDay

+1

Могу, но очень долго. В основном он создает WebRequest для запроса веб-сайта с использованием запроса GET и считывает его в память с помощью StreamReader. Например, веб-сайт содержит номер версии - 2,4 - например. – Brady

ответ

0

Попробуйте запустить процесс за пределами события загрузки. Создать таймер и запустить его на событие Load, а затем обработать событие для клеща:

Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick 
    Timer1.Enabled = False 
    ApplicationUpdate.RunWorkerAsync() 
End Sub 
+0

Спасибо, но я пробовал это, и он все еще зависает. У меня есть таймер, установленный как элемент управления Form1 через 1 секунду. – Brady

1

Ее не фоновый рабочий Фикс, но если вы не возражаете ходить вокруг и не найдя ответа, вы можете код, подобный этому:

Имейте в виду, что при первом запуске Thread, и вы кодируете модель, которую вы ДОЛЖНЫ передать (меня) в исходный поток из-за того, что VB имеет концепцию «экземпляры формы по умолчанию». Для каждой формы в пространстве имен приложения будет экземпляр по умолчанию, созданный в пространстве имен My в рамках свойства Forms.

и что только добавляет дополнительный параметр, как так

---------------------- /Начало Главная Тема/ --- --------------------------------

Private Sub FindCustomerLocation() 
Dim Findcontractor_Thread As New Thread(AddressOf **FindContractor_ThreadExecute**) 
Findcontractor_Thread.Priority = ThreadPriority.AboveNormal 
Findcontractor_Thread.Start(me) 
End Sub 

----------- ------- /Running тема/ ---------------

Private Sub **FindContractor_ThreadExecute**(beginform as *NameOfFormComingFrom*) 
Dim threadControls(1) As Object 
threadControls(0) = Me.XamDataGrid1 
threadControls(1) = Me.WebBrowserMap 

**FindContractor_WorkingThread**(threadControls,beginform) ' ANY UI Calls back to the Main UI Thread MUST be delegated and Invoked 
End Sub 

--------- --------- /Как настроить пользовательский интерфейс вызовов из нити/ ---------------------

Delegate Sub **FindContractor_WorkingThread**(s As Integer,beginform as  *NameOfFormComingFrom*) 
Sub **FindContractor_WorkingThreadInvoke**(ByVal s As Integer,beginform as  *NameOfFormComingFrom*) 
If beginform.mouse.InvokeRequired Then 
Dim d As New FindContractor_WorkingThread(AddressOf  FindContractor_WorkingThreadInvoke) 
beginform.Invoke(d, New Object() {s,beginform}) 
Else 
beginform.Mouse.OverrideCursor = Cursors.Wait 

'Do something... 

beginform.Mouse.OverrideCursor = Nothing 
End If 
End Sub 

Sources From Pakks Answer Tested!

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