与.NET可移植子集一起使用System.Threading.Tasks.Parallel

时间:2013-10-20 19:17:32

标签: portable-class-library

我正在尝试使用配置文件158(针对Windows应用程序,.NET Framework 4.5,Silverlight 5和Windows Phone 8的.NET)在可移植类库项目中使用System.Threading.Tasks.Parallel.ForEach。我正在运行Visual Studio Professional 2012 Update 3。

当我写这样的代码时:

var list = new List<int> {1, 2, 3, 4};
int whoCares;
System.Threading.Tasks.Parallel.ForEach(list, (item) => whoCares += item);

编译器说“命名空间'System.Threading.Tasks'中不存在类型或命名空间名称'Parallel'”(我意识到这个示例代码实际上不是线程安全的。)

我已在MSDN上确认可移植类库支持Parallel.ForEach。如果我使用对象浏览器浏览我对“.NET Portable Subset”的引用,我看到System.Threading.Tasks.Parallel,组件“.NET Portable Subset”的成员,它确实有System.Threading.Tasks的定义。 .Parallel.ForEach。

如何在我的PCL项目中访问Parallel.ForEach,我该怎么做?

3 个答案:

答案 0 :(得分:7)

MSDN对Portable Class Libraries的介绍,在标题为支持的类型和成员的部分中表明您可以简单地参考给定MSDN的版本信息部分帮助主题以确定是否支持可移植类库的成员。或者,在查看某个类的成员表时,PCL支持的成员旁会显示某个图标。

因此,例如,在System.Threading.Tasks Namespace的文档中,Parallel的表条目确实有一个图标,表明它支持PCL。 Parallel.ForEach的参考文档有一个版本信息部分,表示支持:便携式类库&#34;。

事实证明,这些信息不够精细。 Microsoft发布了更详细的信息,但据我所知,它只能以Excel电子表格的形式提供。它最初是从Microsoft博客文章How to Make Portable Class Libraries Work for You链接的。 Microsoft提供的缩短网址为http://sdrv.ms/OVdfNc,扩展为https://skydrive.live.com/view.aspx?resid=8A7FB4A4B32FB2C9!180&app=Excel&authkey=!AHaBmLAhQ49YCI0

这是一个1.1MB的电子表格。唉,在这个电子表格中,显示.NET 4.5支持Parallel.ForEach,但SL5或WP8不支持。

答案 1 :(得分:0)

Microsoft Research提供了(非常)部分实现(在自动图形布局库中使用,现在是MIT许可下的开源),位于:

https://github.com/Microsoft/automatic-graph-layout/blob/master/GraphLayout/MsaglSilverlight/Compatibility.cs

答案 2 :(得分:0)

您可以手动构建任务列表,然后只需等待它们:

int whoCares;
var list = new List<int> {1, 2, 3, 4};
List<Task> myTasks = new List<Task>();

foreach (var item in list) // Artificially implement Parallel.For because this is a PCL
{
    myTasks.Add(Task.Run(() =>
    {
        // Task logic goes here
        whoCares += item
    }));
}

await Task.WhenAll(myTasks);

基于this post