Sie werden nicht in der Lage sein, um die Abfragesyntax oder die let
Operation zu verwenden, aber Sie können eine Methode schreiben, um mehrere Operationen für jedes Element parallel durchführen:
public static ParallelQuery<TFinal> SelectAll<T, TResult1, TResult2, TFinal>(
this ParallelQuery<T> query,
Func<T, TResult1> selector1,
Func<T, TResult2> selector2,
Func<TResult1, TResult2, TFinal> resultAggregator)
{
return query.Select(item =>
{
var result1 = Task.Run(() => selector1(item));
var result2 = Task.Run(() => selector2(item));
return resultAggregator(result1.Result, result2.Result);
});
}
Diese schreiben Sie erlauben würde:
var query = list.AsParallel()
.SelectAll(LongRunningCalc1,
LongRunningCalc2,
(a, b) => new {a, b})
Sie Überlastungen für zusätzliche parallele Operationen als auch hinzufügen:
public static ParallelQuery<TFinal> SelectAll<T, TResult1, TResult2, TResult3, TFinal>
(this ParallelQuery<T> query,
Func<T, TResult1> selector1,
Func<T, TResult2> selector2,
Func<T, TResult3> selector3,
Func<TResult1, TResult2, TResult3, TFinal> resultAggregator)
{
return query.Select(item =>
{
var result1 = Task.Run(() => selector1(item));
var result2 = Task.Run(() => selector2(item));
var result3 = Task.Run(() => selector3(item));
return resultAggregator(
result1.Result,
result2.Result,
result3.Result);
});
}
Es ist möglich, eine Version zu behandeln eine Reihe von Selektoren nicht bei der Kompilierung bekannt zu schreiben, aber zu tun, dass sie alle einen Wert des gleichen Typs berechnen müssen:
public static ParallelQuery<IEnumerable<TResult>> SelectAll<T, TResult>(
this ParallelQuery<T> query,
IEnumerable<Func<T, TResult>> selectors)
{
return query.Select(item => selectors.AsParallel()
.Select(selector => selector(item))
.AsEnumerable());
}
public static ParallelQuery<IEnumerable<TResult>> SelectAll<T, TResult>(
this ParallelQuery<T> query,
params Func<T, TResult>[] selectors)
{
return SelectAll(query, selectors);
}
Dies ist nicht mein Expertenbereich, aber müssen Sie nicht auf die Ergebnisse der Aufgaben warten? – Magnus
@Magnus bin ich schon. – Servy
Yeh Calling '.Result' wartet auf die Ausführung der Task. Ich habe meinen Beispielcode ein wenig vereinfacht, aber das hat mich auf den richtigen Weg gebracht, danke für die Hilfe. – Lyall