0

我对 BackgroundWorkers 的想法是全新的,所以这让我有点困惑。

所以我创建了一个新的 WPF 应用程序并创建了一个 BackgroundWorker 和 List 类变量:

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

然后我使用 BackgroundWorker 来填充该列表:(在同一个类中)

    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 方法的那一刻。*在那之后,它恢复为一个空列表。我曾一度将列表更改为静态,但没有任何改变。

那么为什么这个 List 在整个程序执行过程中没有持续存在呢?

我(曾经)几乎可以肯定,这是为每个线程分配在不同内存区域中的列表的一些问题,但我对 BackgroundWorker 和 MultiThreading 的了解太少了,无法自行诊断。

任何帮助,将不胜感激。

4

2 回答 2

0

在开始使用更昂贵的选项之前,例如锁定或线程安全集合。尝试线程任务。如果他们工作,那么你的 BackgroundWorker 有某种问题,如果他们没有,那么你的代码会在某个地方触及列表,你必须跟踪它..(我只是认为 Tasks 更容易使用)

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...
                }
            });
    }
于 2013-07-12T15:49:15.940 回答
0

@Stephen Marsh 和@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());

要更正,您可以在 call 之前添加此行RunWorkerAsync

bw.RunWorkerCompleted += bw_RunWorkerCompleted;

并将其放在 MainWindows 类的任何位置。

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

在我的测试中,结果总是:

"Without wait: 0"
"Completed: 100000"
于 2013-07-12T15:54:04.793 回答