小编EN *_*eer的帖子

在.NET 4.0中使用Task with Parallel.Foreach

我开始尝试向Windows窗体添加进度条,以更新在Parallel.Foreach循环中运行的代码的进度.为此,UI线程必须可用于更新进度条.我使用Task来运行Parallel.Foreach循环以允许UI线程更新进度条.

在Parallel.Foreach循环中完成的工作相当密集.在使用Task运行程序的可执行文件(不在visual studio中调试)之后,程序没有响应.如果我在没有Task的情况下运行程序,情况就不是这样.我在两个实例之间注意到的关键区别是,在没有Task的情况下运行时程序需要大约80%的cpu,在使用Task运行时大约需要5%.

private void btnGenerate_Click(object sender, EventArgs e)
    {
        var list = GenerateList();
        int value = 0;
        var progressLock = new object ();

        progressBar1.Maximum = list.Count();

        Task t = new Task(() => Parallel.ForEach (list, item =>
        {
                DoWork ();
                lock (progressLock)
                {
                    value += 1;
                }
        }));

        t.Start();

        while (!t.IsCompleted)
        {
            progressBar1.Value = value;
            Thread.Sleep (100);
        }
    }
Run Code Online (Sandbox Code Playgroud)

旁注:我知道

 Interlocked.Increment(ref int___);
Run Code Online (Sandbox Code Playgroud)

用来代替锁.它被认为更有效吗?

我的问题有三个方面:

1.)当负载少得多时,为什么带有Task的程序会无响应?

2.)使用Task运行Parallel.Foreach是否将Parallel.Foreach的线程池限制为只运行任务的线程?

3.)有没有办法让UI线程响应而不是在没有使用取消令牌的情况下休眠.1秒的持续时间?

我很感激任何帮助或想法,我花了很多时间研究这个.如果我违反任何发布格式或规则,我也会道歉.我试图坚持他们,但可能错过了一些东西.

c# parallel-processing multithreading .net-4.0

4
推荐指数
1
解决办法
2133
查看次数