加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 在WinForms上使用TPL进行并行编程

发布时间:2020-12-16 01:54:17 所属栏目:百科 来源:网络整理
导读:我试图在WinForms .NET 4.0上使用TPL,我按照 this步骤(转到文章的末尾)进行了WPF并进行了一些小改动,因此它可以在WinForms上运行,但它仍然不起作用..它应该显示标签和richTextBox上的结果,但它不…我认为并行处理工作导致鼠标开始移动缓慢一段时间我点击按钮
我试图在WinForms .NET 4.0上使用TPL,我按照 this步骤(转到文章的末尾)进行了WPF并进行了一些小改动,因此它可以在WinForms上运行,但它仍然不起作用..它应该显示标签和richTextBox上的结果,但它不…我认为并行处理工作导致鼠标开始移动缓慢一段时间我点击按钮..

public static double SumRootN(int root)
{   double result = 0;
    for (int i = 1; i < 10000000; i++)
    {   result += Math.Exp(Math.Log(i) / root);}
    return result;
}
private void button1_Click(object sender,EventArgs e)
{   richTextBox1.Text = "";
    label1.Text = "Milliseconds: ";
    var watch = Stopwatch.StartNew();
    List<Task> tasks = new List<Task>();
    for (int i = 2; i < 20; i++)
    {   int j = i;
        var t = Task.Factory.StartNew
          (   () =>
                {   var result = SumRootN(j);
                    Dispatcher.CurrentDispatcher.BeginInvoke
                        (new Action
                             (   () => richTextBox1.Text += "root " + j.ToString() 
                                   + " " + result.ToString() + Environment.NewLine
                             ),null
                        );
                 }
            );
        tasks.Add(t);
    }
    Task.Factory.ContinueWhenAll
         (  tasks.ToArray(),result =>
                {   var time = watch.ElapsedMilliseconds;
                    Dispatcher.CurrentDispatcher.BeginInvoke
                          (   new Action
                                (    () =>
                                      label1.Text += time.ToString()
                                 )
                           );
                }
        );
}

解决方法

您的代码将无法正常工作,因为显示结果的线程UI与WPF完全不同.
使用WPF,线程UI是Dispatcher,但在Windows Form上是另一个.

我修改了你的代码以帮助它工作.

private void button1_Click(object sender,EventArgs e)
    {
        richTextBox1.Text = "";
        label1.Text = "Milliseconds: ";

        var watch = Stopwatch.StartNew();
        List<Task> tasks = new List<Task>();
        for (int i = 2; i < 20; i++)
        {
            int j = i;
            var t = Task.Factory.StartNew(() =>
            {
                var result = SumRootN(j);
                richTextBox1.Invoke(new Action(
                        () =>
                        richTextBox1.Text += "root " + j.ToString() + " " 
                              + result.ToString() + Environment.NewLine));
            });
            tasks.Add(t);
        }

        Task.Factory.ContinueWhenAll(tasks.ToArray(),result =>
              {
                  var time = watch.ElapsedMilliseconds;
                  label1.Invoke(new Action(() => label1.Text += time.ToString()));
              });
    }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读