2014-12-22 2 views
1

Я пытаюсь использовать Parallel.ForEach для Excel, но я получаю ошибку. кодКак использовать Parallel.ForEach для Excel?

using System.Threading.Tasks; 
using Excel = Microsoft.Office.Interop.Excel; 

public void function(Excel.Range range) 
{ 
    Parallel.ForEach(range, item=> 
    { 
     //do stuff 
    }); 
} 

Ошибка Ошибка 7: Аргументы типа для метода «System.Threading.Tasks.Parallel.ForEach (System.Collections.Generic.IEnumerable, System.Action)» не может быть выведена из Применение. Попробуйте явно указать аргументы типа.

Если у вас есть какие-либо идеи, я буду очень признателен.

+1

Невозможно использовать Excel из нескольких потоков. Excel является однопоточным (COM STA), поэтому все вызовы будут в любом случае распределены по одному и тому же потоку. – adrianm

+0

@adrianm, я предлагаю вам преобразовать это в ответ. –

ответ

3

Ошибка, которую вы видите, потому что Parallel.ForEach не поддерживается в не общих коллекциях.

От Parallel Programming in .NET blog:

.NET 2.0 введены дженерик, чтобы усиленное повторное использование кода и типобезопасности. С тех пор общие коллекции (IEnumerable, List, Dictionary и т. Д.) Стали стандартными и рекомендуются над их неродственными аналогами (IEnumerable, ArrayList, HashTable и т. Д.). В результате Parallel.ForEach поддерживает только общие коллекции , поэтому код, подобный приведенному ниже, не будет скомпилирован.

Существует обходной путь, используя IEnumerable.Cast, как они упоминают в блоге:

Parallel.ForEach(r.Cast<object>(), _ => 
{ 
    // Do stuff 
}); 

Хотя это компилировать, он будет не работать с Excel.Range, как это имеет сродство нить и только будет работайте через поток STA, поскольку он выполняет COM-взаимодействие.

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