驚くべきことに、この拡張機能によって PLINQ クエリの速度が低下することはありませんでした。これは測定できました。
多くの AsParallel() 呼び出しを含む複雑なクエリでは、各 AsParallel() の後に SetCulture() を呼び出す必要がある場合があります。.SetCulture() を追加する場所が 1 つ (または AsParallel の場合は 1 つ) あるかどうかわからないので、各 AsParallel() 呼び出しの後に .SetCulture() を追加したところ、うまくいきました。
さらに、CurrentUICulture の設定も検討できます。たとえば、PLINQ を使用してビジネス オブジェクト コレクションを検索し、壊れたルール (CSLA フレームワーク、壊れたルール コレクション) を持つビジネス オブジェクトを見つけると、PLINQ スレッド (スレッド プール スレッド) がローカライズされた (私たちの要件) 文字列リソースを検索して、エラー文字列 (RuleArgs) を設定します。 。説明)。
ParallelQueryCultureExtensions 拡張機能を拡張する必要がありました。これは私にとってはうまくいきました(VB.NETを使用する必要があるため、...):
Public Module PLINQExtensions
<Extension()> _
Public Function SetCulture(Of TSource)(ByVal source As ParallelQuery(Of TSource), ByVal culture As CultureInfo, ByVal uiCulture As CultureInfo) As ParallelQuery(Of TSource)
SetCulture(culture, uiCulture)
Return source.Select(Function(item)
SetCulture(culture, uiCulture)
Return item
End Function
)
End Function
<Extension()> _
Private Sub SetCulture(ByVal culture As CultureInfo, ByVal uiCulture As CultureInfo)
If (Not Thread.CurrentThread.CurrentCulture.Equals(culture)) Then
Thread.CurrentThread.CurrentCulture = culture
End If
If (Not Thread.CurrentThread.CurrentUICulture.Equals(uiCulture)) Then
Thread.CurrentThread.CurrentUICulture = uiCulture
End If
End Sub
End Module