【问题标题】:WPF to Silverlight threading conversionWPF 到 Silverlight 线程转换
【发布时间】:2011-05-11 19:38:20
【问题描述】:

在 .Net 4 上的 WPF 中,我有一个类似的循环生成后台工作:

        Point[] points = GetPoints();
        List<Task> tasks = new List<Task>();

        // loop bitmap
        for (int x = 0; x < bitmap.Width; x++) {
           for (int y = 0; y < bitmap.Height; y++) {
              Task t = new Task((object point) => {
                  Point p = points[((Point)point).Y * bitmap.Width + ((Point)point).X];
                  p.CalculateInterference(); // a bit slow
              }, new Point(x, y));
              t.Start();
              tasks.Add(t);
           }
           // after spawning tasks for all the Y column I need them to finish before proceeding
           foreach (var t in tasks) {
             t.Wait();
           }
           tasks.Clear();
        }

使用 .NET4 中的 Task 类很容易,但在 Silverlight 3 上我看不到它们...

什么是最简单但仍然正确的方法可以在 Silverlight 中完成这项工作,而无需并行生成 Y 个线程,因为 Y 可能是一个很大的值。使用主机可用的CPU资源就好了……

谢谢!

【问题讨论】:

  • 线程池?不过你必须自己做很多工作。
  • 也许是 ThreadPool 但如何正确使用它与这个构造,我需要它们都在内循环之后完成。如果我将它们全部排入队列并在尚未安排很快在池中运行的线程上执行 Thread.Join,我基本上会阻塞直到它运行并杀死并行性的所有性能增益?还是我弄错了?
  • 那肯定会做很多工作,这就是为什么我没有将其发布为“答案”;)

标签: c# .net wpf silverlight-3.0


【解决方案1】:

对于 .NET4 版本,您最好使用Parallel.For

正好适合这种情况。

对于 Silverlight,您可以自行开发,这里有一些代码可以帮助您入门:

请参阅标题为循环平铺的部分。

【讨论】:

  • 很好的提示,我会看看第二个链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-10
  • 1970-01-01
相关资源
最近更新 更多