2013-07-12 1 views
0

Я новичок в идее BackgroundWorkers, так что это меня немного озадачивает.Переменная класса, заданная BackgroundWorker, не сохраняется.

Так что я создал новое приложение WPF и создал переменную BackgroundWorker и список класса:

public partial class MainWindow : Window 
{ 
    private BackgroundWorker bw = new BackgroundWorker(); 
    private List<int> tempList = new List<int>(); 
    ... 

Затем я использую BackgroundWorker для заполнения этого списка: (в том же классе BTW)

private void bw_DoWork(object sender, DoWorkEventArgs e) 
    { 
     BackgroundWorker worker = sender as BackgroundWorker; 
     Random r = new Random(); 
     for (int j = 1; j <= 100; j++) 
     { 
      for (int i = 0; i < 1000; i++) 
      { 
       tempList.Add(r.Next(100)); 
      } 
      ... 
     } 
    } 

Теперь вот часть, которая меня достает ...

Код, который заполняет этот список, кажется, работает нормально. Когда я выполняю его выполнение, * он ведет себя так, как я предполагал, до момента, когда код выходит из метода bw_DoWork. * После этой точки возвращается в пустой список. Я изменил список на статический в одной точке, но ничего не изменилось.

Так почему же этот список не сохраняется во время выполнения программ?

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

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

+0

Я бы передать список в качестве объекта арг или создать его в 'do_work', как вы оставите себя открытым, чтобы пересечь поточную проблему в настоящее время – DGibbs

+0

Могла вы проверяете, будет ли этот список также пустым в обработчике событий RunWorkerCompleted? – Douglas

+1

Что Дуглас сказал, также является «RunWorkerEventArgs.Error» возвратом null или ошибкой? – Sayse

ответ

0

Прежде чем вы начнете использовать более дорогие варианты, такие как блокировка или сборка с потоком. Попробуйте задачи Threading. Если они работают, у вас есть какая-то проблема с вашим BackgroundWorker, если они этого не сделают, ваш код коснется списка где-нибудь, и вам придется проследить это. (Я просто думаю, что задачи намного легче работать)

private void bw_DoWork() 
    { 
     Task.Factory.StartNew(
      () => 
      { 
       var r = new Random(); 
       for (int j = 1; j <= 100; j++) 
       { 
        for (int i = 0; i < 1000; i++) 
        { 
         tempList.Add(r.Next(100)); 
        } 
        //the rest of whaterver you're doing... 
       } 
      }); 
    } 
0

@ Stephen Marsh like @Douglas сказал, что вам нужно подождать, пока работа закончится.

Смотреть это:

// this execute the DoWork asynchronously. 
bw.RunWorkerAsync(); 
// asynchronously means the next line may be executed 
// before the DoWork fill the list. In fact can be executed 
// before the DoWork begin. 
MessageBox.Show("Without wait: " + tempList.Count.ToString()); 

Чтобы исправить вы можете добавить эту строку перед вызовом RunWorkerAsync:

bw.RunWorkerCompleted += bw_RunWorkerCompleted; 

и поместить его в любом месте класса MainWindows.

void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    MessageBox.Show("Completed: " + tempList.Count.ToString()); 
} 

В моих тестах всегда результат был:

"Without wait: 0" 
"Completed: 100000" 
Смежные вопросы