Использование backgroundworker в многопоточном приложении - PullRequest
0 голосов
/ 13 августа 2011

Мой запрос о BackgroundWorker.

У меня есть приложение Windows Forms, которое запускает 10 новых тем. Каждый поток получит информацию от 10 различных веб-сервисов. Все, что мне нужно, это добавить результат вызова веб-службы в поле расширенного текста в режиме конструктора Как я могу использовать фоновый поток в этом сценарии?

ArrayList threadList;

for (int idx = 0; idx < 10; ++idx)
{
    Thread newth= new Thread(new ParameterizedThreadStart(CallWS));
    threadList.Add(newth);       
}


for (int idx = 0; idx < 10; ++idx)
{
    Thread newth= new Thread(new ParameterizedThreadStart(CallWS));
    newth.Start(something);          
}


for (int idx = 0; idx < 10; ++idx)
{
    //Cast form arraylist and join all threads.
}

private void CallWS(object param)
{
    // Calling WS
    // got the response.
    // what should I do to append this to rich text box using background worker.
}

Любая помощь высоко ценится.

Ответы [ 3 ]

1 голос
/ 13 августа 2011

Я не уверен, является ли использование BackgroundWorker лучшим решением в вашем случае. Однако, если вы используете backgroundWorker, вы можете использовать одно и то же событие RunWorkerCompleted (которое запускается в основном потоке) для всех BackgroundWorkers. Так что вы можете обновить свой интерфейс на этом событии.

Если вы ищете пример для backgroundWorker, посмотрите здесь .

1 голос
/ 13 августа 2011

Я не очень понимаю контекст, но я верю в следующее:

  1. Вы работаете с Windows.Forms
  2. У вас есть несколько тем
  3. Каждый поток хочет выполнить код (добавление текста) в потоке пользовательского интерфейса

Так что решение не использует BackgroundWorker. Вместо этого вы должны использовать BeginInvoke: http://msdn.microsoft.com/en-us/library/system.windows.forms.richtextbox.begininvoke.aspx

RichTextBox.BeginInvoke Method

Асинхронно выполняет делегат в потоке, в котором был создан базовый дескриптор элемента управления.

Ваша проблема, как Ханс Пассант прокомментировал ответ sllev , возможно, вы по какой-то причине блокируете поток пользовательского интерфейса, используя Invoke.

Попробуйте заменить Invoke на BeginInvoke.

1 голос
/ 13 августа 2011

В рабочих потоках вы можете обновить richtextbox следующим образом:

private void CallWS(object param)
{
    string updatedText = ..

    // build a text    

    this.Invoke((MethodInvoker)delegate {
        // will be executed on UI thread
        richTextBox.Text = updatedText; 
    });
}
...