2013-03-26 6 views
0

У меня есть listcollectionview, что я хочу, чтобы перебрать с помощью Parallel.ForParallel.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(); 
    } 

Im получаю следующее сообщение об ошибке:

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)<--- 

Как Могу ли я исправить это? (образец кода будет замечательным)

ответ

0

Вы не можете использовать параллельную обработку для обновления элементов пользовательского интерфейса. Только основной поток вашего приложения имеет права доступа к пользовательскому интерфейсу. Вы можете позвонить Invoke на флажках, но для работы, которую вы выполняете, в чем же смысл делать это параллельно? Он не будет покупать вам какую-либо производительность.

Я рекомендую использовать только обычный цикл for, а не Parallel.For.

+0

Я не могу использовать регулярные 'for', список большой и UI Freezes. – RayOldProf

+0

Вы можете задаться вопросом, есть ли у этого хорошего пользовательского интерфейса так много флажков, что пользовательский интерфейс замерзнет, ​​если вы повторите его ... В любом случае вы не сможете сделать это быстрее, делая это параллельно, даже если вы используете Invoke. –

+0

У меня есть только один checkBox. – RayOldProf

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