интерфейс обновления параллельных событий - PullRequest
0 голосов
/ 26 ноября 2010

У меня есть класс, написанный на C #. В нем я хочу запустить определенную функцию параллельно в списке. После того, как он завершится для каждого элемента, я хотел бы обновить индикатор выполнения. Тем не менее, я получаю очень странное поведение от моей программы. Он выполняет событие и достигает моего сабвуфера, но никогда не приступает к выполнению кода. Вместо этого он просто зависает. (Я смешал vb.net и c #. В какой-то момент он будет переписан)

поэтому в моем окне я звоню

    progressBar.Visible = True
    progressBar.Value = 0
    progressBar.Maximum = dataGrid.SelectedRows.Count

    AddHandler quoteManager.refreshStarted, AddressOf progressBarCounter
    quoteManager.refreshAllAsync(list)

и событие просто

Private Sub progressBarCounter()
    Me.Invoke(Sub()
                  If progressBar.Value = progressBar.Maximum Then
                      progressBar.Visible = False
                  Else
                      progressBar.Value += 1
                  End If
              End Sub)
End Sub

и в классе менеджера котировок я определил это.

    public event Action refreshStarted;

    public void refreshAllAsync(List<BindableQuote> bindableQuotes)
    {
        bindableQuotes.AsParallel()
            .WithDegreeOfParallelism(10)
            .ForAll((quote) => {
                quote.refreshAll();
                if (refreshStarted != null) { refreshStarted(); }
            });
    }

Так что по какой-то причине я получаю его для ввода progressBarCounter для каждого элемента в списке, но он никогда не существует. Вместо этого он просто сохраняет форму замороженной.

Ответы [ 2 ]

0 голосов
/ 26 ноября 2010

Я не совсем уверен, что это именно то, что происходит, но похоже, что progressBarCounter блокирует, потому что вы вызываете Invoke.Вы должны использовать вместо BeginInvoke?Использование BeginInvoke может решить проблему взаимоблокировки.Смотрите этот пост: В чем разница между Invoke () и BeginInvoke ()

0 голосов
/ 26 ноября 2010

Похоже, что здесь происходит то, что вы получаете доступ к объектам пользовательского интерфейса из нескольких потоков.

Это не поддерживается. Вам нужно будет запустить этот код в рабочем потоке, позволить ему каким-то образом накапливать прогресс и отправлять сообщения обратно в поток пользовательского интерфейса. Класс BackgroundWorker может помочь вам выполнить сортировку обратно в поток пользовательского интерфейса.

...