De l'information que vous » Vraiment donné, je comprends que vous voulez avoir un tableau de sortie de Foo avec une taille égale au tableau d'entrée d'octets? Est-ce correct?
Si oui, oui l'opération est simple. Ne vous embêtez pas avec des constructions verrouillées ou synchronisées, celles-ci vont éroder toute la vitesse que vous donne la parallélisation.
Au lieu de cela, si vous obéissez cette règle simple tout algorithme peut être parallélisés sans verrouillage ou synchronisation:
Pour chaque élément d'entrée X [i] traitée, vous pouvez lire à partir de tout élément d'entrée X [j], mais seulement écrire à l'élément de sortie Y [i]
Consulter/regroupement, ce type d'opération est appelé un seul Rassemblez élément de sortie est écrite.
Si vous pouvez utiliser le principe ci-dessus, vous voulez créer votre tableau de sortie Foo [] à l'avant, et utiliser Parallel.For ForEach sur le tableau d'entrée.
E.g.
List<byte[]> inputArray = new List<byte[]>();
int[] outputArray = new int[inputArray.Count];
var waitHandle = new ManualResetEvent(false);
int counter = 0;
Parallel.For(0, inputArray.Count, index =>
{
// Pass index to for loop, do long running operation
// on input items
// writing to only a single output item
outputArray[index] = DoOperation(inputArray[index]);
if(Interlocked.Increment(ref counter) == inputArray.Count -1)
{
waitHandle.Set();
}
});
waitHandler.WaitOne();
// Optional conversion back to list if you wanted this
var outputList = outputArray.ToList();
après un certain code d'échantillon et s'il vous plaît pour le dossier qui rend les choses ne marche pas nécessairement parallèle rendent plus rapide et efficace ... Je me demande si Parallel.For résoudrait votre problème. Ce –
adt
est un double de celle-ci: http://stackoverflow.com/questions/3639768/parallel-foreach-ordered-execution Pour répondre, vous pouvez utiliser PLINQ (AsOrdered, AsParallel) pour faire le travail. – Kadelka
Il vaudrait mieux avoir l'équivalent parallèle de 'Select' ou' Map' pour conserver l'ordre d'entrée. – leppie