我試圖想出一種方法來加速以最快的方式將列表中包含的大量對象組合起來。希望利用PLINQ我嘗試過,但這不是一個線程安全的解決方案。我已經在VS2010和VS11Beta中測試過4.0和4.5。這是我的示例應用程序。如果你在1-500之間改變BlowUp(),它通常會起作用。 500後輪子來自賽道。它會在多個地方失敗。有沒有人知道解決這個問題的最快方法? (多維數組+ PLINQ?)PLINQ對於.NET 4.0和4.5中的所有破解
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace PLinqBlowsUp
{
class Program
{
static void Main(string[] args)
{
BlowUp(5000);
}
private static void BlowUp(int blowupNum)
{
try
{
var theExistingMasterListOfAllRowsOfData = new List<List<KeyValuePair<string, dynamic>>>();
//Add some test data
Enumerable.Range(0, blowupNum).AsParallel().ForAll(row => theExistingMasterListOfAllRowsOfData.Add(AddRowToMasterList(row)));
var aNewRowOfData = new List<KeyValuePair<string, dynamic>>();
//Add some test data
var column = new KeyValuePair<string, dynamic>("Title", "MyTitle");
aNewRowOfData.Add(column);
var anotherNewRowOfData = new List<KeyValuePair<string, dynamic>>();
//Add some test data
var columnA = new KeyValuePair<string, dynamic>("Date", DateTime.Now);
var columnB = new KeyValuePair<string, dynamic>("ImportantColumn", "ImportantData");
var columnC = new KeyValuePair<string, dynamic>("VeryImportantColumn", "VeryImportantData");
anotherNewRowOfData.Add(columnA);
anotherNewRowOfData.Add(columnB);
anotherNewRowOfData.Add(columnC);
//Now the Problem
aNewRowOfData.AsParallel().ForAll(anrod => theExistingMasterListOfAllRowsOfData.ForEach(temloarod => temloarod.Add(anrod)));
anotherNewRowOfData.AsParallel().ForAll(anrod => theExistingMasterListOfAllRowsOfData.ForEach(temloarod => temloarod.Add(anrod)));
//Test for number
foreach (var masterRow in theExistingMasterListOfAllRowsOfData)
{
if (masterRow.Count != 7)
throw new Exception("BLOW UP!!!");
}
}
catch (AggregateException ex)
{
Console.WriteLine(ex.Message);
}
}
private static List<KeyValuePair<string, dynamic>> AddRowToMasterList(int row)
{
var columnA = new KeyValuePair<string, dynamic>("FirstName", "John" + row.ToString());
var columnB = new KeyValuePair<string, dynamic>("LastName", "Smith" + row.ToString());
var columnC = new KeyValuePair<string, dynamic>("Ssn", 123456789 + (row*10));
var list = new List<KeyValuePair<string, dynamic>>();
list.Add(columnA);
list.Add(columnB);
list.Add(columnC);
return list;
}
}
}
採取下面的建議......目前正嘗試使用KVP的多維陣列的ForAll來爲此類型進程提供多個內核的速度。 – YurikoEX
誰喜歡這樣一個問題?它指出「PLinq的ForAll不起作用」,這很簡單,不正確,只顯示來自提問者的誤解(這是合法的;沒有人知道所有事情,但問題在目前的形式中是不好的)。 ForAll被破解的機會有多少,到現在爲止還沒有人意識到這一點? – sloth