5

我正在尝试在使用配置文件 158 的可移植类库项目中使用 System.Threading.Tasks.Parallel.ForEach(针对 Windows Store Apps、.NET Framework 4.5、Silverlight 5 和 Windows Phone 8 的 .NET。)我正在运行Visual Studio 专业版 2012 更新 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?

4

3 回答 3

7

MSDN 对Portable Class Libraries的介绍,在标题为Supported Types and Members的部分中表明,您可以简单地参考给定 MSDN 帮助主题的Version Information部分来确定 Portable Class Libraries 是否支持成员。或者,在查看某个类的成员表时,PCL 支持的成员旁边会出现一个特定图标。

因此,例如,在System.Threading.Tasks Namespace的文档中,Parallel 的表条目确实有一个图标,表明它支持 PCL。Parallel.ForEach的参考文档有一个版本信息部分,指示“支持:可移植类库”。

事实证明,这些信息不够精细。Microsoft 发布了更详细的信息,但据我所知,它仅以 Excel 电子表格的形式提供。它最初链接自 Microsoft 博客文章How to Make Portable Class Libraries Work for You。微软提供的 URL 缩短为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 不支持。

于 2013-10-21T17:17:08.733 回答
0

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

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

于 2015-06-03T22:31:37.977 回答
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);

基于这篇文章

于 2017-01-12T19:34:39.677 回答