我有一個listcollectionview
,我想遍歷使用Parallel.For
的Parallel.For及的ListCollectionView
到目前爲止我有:
public void HighlightLoggingLvl(
LoggingLvl.ELoggingLvl loggingLvl, bool ebool) {
Parallel.For(0, HighlighterCollectionView.Count, i => {
Log4NetLog cC =
HighlighterCollectionView.GetItemAt(i) as
Log4NetLog;
if (cC != null &&
cC.MyLoggingLvl.EloggingLvl == loggingLvl) {
if (ebool) {
cC.LogColour.SetColor(cC.MyLoggingLvl);
} else {
cC.LogColour.Colour = Colors.Transparent;
}
}
});
HighlighterCollectionView.Refresh();
}
即時得到以下錯誤:
A first chance exception of type 'System.InvalidOperationException' occurred in WindowsBase.dll
A first chance exception of type 'System.InvalidOperationException' occurred in WindowsBase.dll
A first chance exception of type 'System.InvalidOperationException' occurred in mscorlib.dll
A first chance exception of type 'System.InvalidOperationException' occurred in mscorlib.dll
A first chance exception of type 'System.AggregateException' occurred in mscorlib.dll
A first chance exception of type 'System.AggregateException' occurred in mscorlib.dll
A first chance exception of type 'System.Reflection.TargetInvocationException' occurred in mscorlib.dll
System.Windows.Data Error: 8 : Cannot save value from target back to source. BindingExpression:Path=Log4NetSearchEngineCompassLogView.Log4NetHighlighter.IsAllHighlighterEnable; DataItem='CompassLogView' (HashCode=57871897); target element is 'CheckBox' (Name=''); target property is 'IsChecked' (type 'Nullable`1') AggregateException:'System.AggregateException: One or more errors occurred. ---> System.InvalidOperationException: The calling thread cannot access this object because a different thread owns it.
at System.Windows.Threading.Dispatcher.VerifyAccess()
at System.Windows.Threading.DispatcherObject.VerifyAccess()
at System.Windows.Data.CollectionView.VerifyRefreshNotDeferred()
at System.Windows.Data.ListCollectionView.GetItemAt(Int32 index)
at LogViewerViewModel.tools.highlighters.Log4NetHighlighter.<>c__DisplayClass1.<HighlightLoggingLvl>b__0(Int32 i) in c:\Users\Reza\Documents\Visual Studio 2012\Projects\Pallas informatik\LogViewerV1\LogViewerViewModel\src\tools\highlighters\Log4NetHighlighter.cs:line 193
at System.Threading.Tasks.Parallel.<>c__DisplayClassf`1.<ForWorker>b__c()
at System.Threading.Tasks.Task.InnerInvoke()
at System.Threading.Tasks.Task.InnerInvokeWithArg(Task childTask)
at System.Threading.Tasks.Task.<>c__DisplayClass10.<ExecuteSelfReplicating>b__f(Object param0)
--- End of inner exception stack trace ---
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`1 body)
at LogViewerViewModel.tools.highlighters.Log4NetHighlighter.HighlightLoggingLvl(ELoggingLvl loggingLvl, Boolean ebool) in c:\Users\Reza\Documents\Visual Studio 2012\Projects\Pallas informatik\LogViewerV1\LogViewerViewModel\src\tools\highlighters\Log4NetHighlighter.cs:line 190
at LogViewerViewModel.tools.highlighters.Log4NetHighlighter.set_IsDebugHighlighterEnable(Boolean value) in c:\Users\Reza\Documents\Visual Studio 2012\Projects\Pallas informatik\LogViewerV1\LogViewerViewModel\src\tools\highlighters\Log4NetHighlighter.cs:line 59
at LogViewerViewModel.tools.highlighters.Log4NetHighlighter.set_IsAllHighlighterEnable(Boolean value) in c:\Users\Reza\Documents\Visual Studio 2012\Projects\Pallas informatik\LogViewerV1\LogViewerViewModel\src\tools\highlighters\Log4NetHighlighter.cs:line 39
---> (Inner Exception #0) System.InvalidOperationException: The calling thread cannot access this object because a different thread owns it.
at System.Windows.Threading.Dispatcher.VerifyAccess()
at System.Windows.Threading.DispatcherObject.VerifyAccess()
at System.Windows.Data.CollectionView.VerifyRefreshNotDeferred()
at System.Windows.Data.ListCollectionView.GetItemAt(Int32 index)
at LogViewerViewModel.tools.highlighters.Log4NetHighlighter.<>c__DisplayClass1.<HighlightLoggingLvl>b__0(Int32 i) in c:\Users\Reza\Documents\Visual Studio 2012\Projects\Pallas informatik\LogViewerV1\LogViewerViewModel\src\tools\highlighters\Log4NetHighlighter.cs:line 193
at System.Threading.Tasks.Parallel.<>c__DisplayClassf`1.<ForWorker>b__c()
at System.Threading.Tasks.Task.InnerInvoke()
at System.Threading.Tasks.Task.InnerInvokeWithArg(Task childTask)
at System.Threading.Tasks.Task.<>c__DisplayClass10.<ExecuteSelfReplicating>b__f(Object param0)<---
如何我可以修復這個問題嗎? (代碼示例將是巨大的)
我不能使用常規的'for',列表大,UI凍結。 – RayOldProf 2013-03-26 09:13:13
你可能想知道,如果這是很好的UI設計有這麼多的選擇框,如果你遍歷它的用戶界面將凍結......無論哪種方式,你不能並行做這做任何快,即使你使用的調用。 – 2013-03-26 11:54:53
我只有一個複選框。 – RayOldProf 2013-03-26 12:02:16