2016-03-28 2 views
0

Я должен измерить расстояния между примерно 26 000 компаний и найти медиану всех расстояний. Тем не менее, программа бросить исключение ниже:Многопоточная ошибка .net Parallel.For

at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions) 
at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken) 
at System.Threading.Tasks.Task.Wait() 
at System.Threading.Tasks.Parallel.ForWorker[TLocal](Int32 fromInclusive, Int32 toExclusive, ParallelOptions parallelOptions, Action`1 body, Action`2 bodyWithState, Func`4 bodyWithLocal, Func`1 localInit, Action`1 localFinally) 
at System.Threading.Tasks.Parallel.For(Int32 fromInclusive, Int32 toExclusive, Action`2 body) 
at DataHelper.FindMediumBase.CountDistancesPerKilometer() 

Это моя программа:

protected void CountDistancesPerKilometer() 
{ 
    try 
    { 
     int EnterprisesCount = enterprises.Count; 
     Stopwatch watch = new Stopwatch(); 
     watch.Start(); 
     Parallel.For(0, enterprises.Count, (i, loopStateOut) => 
     { 
      Enterprise eOut = enterprises.ElementAt(i); 
      for (int j = i + 1; j < enterprises.Count; j++) 
      { 
       Enterprise eIn = enterprises.ElementAt(j); 
       double distance = Math.Sqrt((eOut.Point.X - eIn.Point.X) * (eOut.Point.X - eIn.Point.X) + 
              (eOut.Point.Y - eIn.Point.Y) * (eOut.Point.Y - eIn.Point.Y))/1000; 

       if (0 == distance) 
        continue; 
       else 
        DistanceFiles[(int)distance].FileRowCount++; 
      } 
     }); 
     watch.Stop(); 
     System.Console.WriteLine(watch.ElapsedTicks); 
    } 
    catch (Exception ex) 
    { 
     Log.WriteError(ex.StackTrace); 
    } 
} 

PS:

enterprises: List<Enterprise> 
DistanceFiles : ConcurrentDictionary<int, DistanceFile> 
+0

'DistanceFiles [(целое) расстояние] .FileRowCount ++;' - Вы уверены, что 'distance' является существующий ключ в словаре? –

+0

Что такое 'DistanceFiles'? –

+0

@DmitryBychenko В нижней части вопроса: 'ConcurrentDictionary ' –

ответ

0

Вы называете ConcurrentDictionary<TKey, TValue>.Item, который может бросить KeyNotFoundException если свойство извлекается и ключа в коллекции не существует.

Изменение вы код для того, чтобы элементы существуют в словаре:

if (0 == distance) 
    continue; 
else 
{ 
    if(!DistanceFiles.ContainsKey((int)distance)) 
    { 
     var distanceFile = GetDistanceFile(); // retrieve or create new instance of tDistanceFile here 
     DistanceFiles,Add((int)distance, distanceFile); 
    } 
    DistanceFiles[(int)distance].FileRowCount++; 
} 
+0

Ну, я не могу гарантировать, что все позиции компаний верны, поэтому ваш ответ, возможно, является правильной причиной! Я попробую, и спасибо большое !!! @ Вадим Мартынов – mzl9039

Смежные вопросы