我试图在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上是另一个.
使用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())); }); }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。