【问题标题】:MaxDegreeOfParallelism blocks the Main thread?MaxDegreeOfParallelism 阻塞主线程?
【发布时间】:2013-10-20 04:18:50
【问题描述】:

我有下一个代码,并且工作正常:

private void BtBasicIntroClick(object sender, EventArgs e)
    {
        var stopwatch = new Stopwatch();
        stopwatch.Reset();
        stopwatch.Start();
        var executionDataflowBlockOptions = new ExecutionDataflowBlockOptions
                {
                    //TaskScheduler = TaskScheduler.FromCurrentSynchronizationContext(),
                    MaxDegreeOfParallelism = 1
                };
        var actionBlock = new ActionBlock<int>(s =>
                                                   {
                                                       //comboBox1.Items.Add((s*3).ToString());
                                                       Invoke(new Action(() => comboBox1.Items.Add((s * 3).ToString())));
                                                   }, executionDataflowBlockOptions);
        var numeros = Enumerable.Range(0, 40000);
        foreach (var numero in numeros)
        {
            actionBlock.Post(numero);
        }
        Task.Factory.StartNew(() =>
                                  {

                                      actionBlock.Completion.ContinueWith(delegate
                                                            {
                                                                stopwatch.Stop();
                                                                if (InvokeRequired)
                                                                {
                                                                    Invoke(new Action(() => 
                                                                        label1.Text = stopwatch.ElapsedMilliseconds.ToString(CultureInfo.InvariantCulture)));
                                                                }
                                                            });
                                      actionBlock.Complete();
                                      actionBlock.Completion.Wait();
                                  });
    }

Windows 窗体工作正常...进程不会阻塞 UI

但如果我将 MaxDgreeOfParallelism 更改为其他值(2 或 3 或 4...),则 UI 将被阻止,直到进程完成。

我在 Visual Studio 中看到了 Parallel Tasks 窗口和 Thread 窗口,在这两种情况下,一切都在 Worked Threads 中工作,但在后一种情况下(当 MaxDgreeOfParallelism 与 1 不同时)UI 直到进程结束

为什么?

【问题讨论】:

  • Control.Invoke 始终在 UI 线程上运行,这是您的代码运行的唯一原因。只有 UI 线程可以触摸控件,并且没有办法绕过它。你想解决什么真正的问题?也许还有其他解决方案

标签: c# task-parallel-library tpl-dataflow


【解决方案1】:

当我尝试你的代码时,UI 一直被阻止,即使是 MaxDegreeOfParallelism = 1。那是因为你的块所做的只是调用Invoke(),这会阻塞 UI 线程。

在某些情况下,一个线程一遍又一遍地调用Invoke() 可能不足以完全阻塞 UI 线程,但几乎肯定有 2 个线程会。

因此,您尝试做的事情没有任何意义。您不会从使用数据流或类似的东西中获得任何好处。

解决此问题的方法是不要在 UI 中包含数千个项目。无论如何,没有人会通过如此庞大的列表。

【讨论】:

    猜你喜欢
    • 2018-02-16
    • 1970-01-01
    • 2015-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-25
    相关资源
    最近更新 更多