2013-10-20 19 views
5

我試圖在使用配置文件158便攜式類庫項目使用System.Threading.Tasks.Parallel.ForEach(對於Windows應用商店應用程序,.NET針對.NET框架4.5,Silverlight的5和Windows Phone 8)我在運行Visual Studio 2012專業版更新3使用System.Threading.Tasks.Parallel與.NET便攜子集

當我寫這樣的代碼:

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

編譯器說:「類型或命名空間命名「水貨」在命名空間「System.Threading.Tasks」不存在」(我知道這個例子的代碼其實不是線程安全的。)

我已經證實了這MSDN是Parallel.ForEach支持便攜式類庫。如果我使用對象瀏覽器來瀏覽我提到的「.NET可移植子集」,我看System.Threading.Tasks.Parallel,組件的「.NET可移植子集」的成員,它確實有System.Threading.Tasks定義.Parallel.ForEach。

我有什麼做的就是在我的PCL項目獲得Parallel.ForEach?

回答

7

的MSDN介紹Portable Class Libraries,在標題爲支持的類型和成員表明,你可以簡單地指給定MSDN幫助主題的版本信息部分,以確定是否一個成員支持便攜式類庫。或者,在查看某個班級的成員表時,會在PCL支持的成員旁邊顯示某個圖標。

因此,例如,對於System.Threading.Tasks Namespace的文檔中,用於並行表項不具有指示它支持PCL的圖標。 Parallel.ForEach的參考文檔有一個版本信息部分,指出「受支持的位置:可移植類庫」。

事實證明,這些信息的粒度不夠細。微軟公佈更詳細的信息,但據我所知,它只能以Excel電子表格的形式提供。它最初從Microsoft博客文章How to Make Portable Class Libraries Work for You鏈接。由微軟提供的縮短網址爲http://sdrv.ms/OVdfNc,其擴展爲https://skydrive.live.com/view.aspx?resid=8A7FB4A4B32FB2C9!180&app=Excel&authkey=!AHaBmLAhQ49YCI0

這是一個1.1MB的電子表格。唉,在這個電子表格中,顯示了Parallel.ForEach在.NET 4.5中受支持,但不受SL5或WP8的支持。

+0

在2014年8月,Microso位ft發佈了一個命令行工具和一個Visual Studio擴展,即.NET可移植性分析器,它可以分析你的項目並顯示它支持哪些平臺。分析器向您顯示項目中的哪些代碼行使用API​​S,但不支持各種平臺。該聲明位於http://blogs.msdn.com/b/dotnet/archive/2014/08/06/leveraging-existing-code-across-net-platforms.aspx。這看起來比在電子表格中查找要方便得多。 –

+0

該電子表格現在顯示在線(通過Excel Online)並顯示速度非常快,因此無需在本地下載 –

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