0

Tasks.Parallelを実行する1人のbackgroundworkerを使用しています。コードに従う:

Public Class SlidertoCanvasBlackWhite
    Implements IValueConverter
    Dim li As New Concurrent.ConcurrentDictionary(Of Integer, ImageBrush)

    Public Sub New()
        Dim bw As New ComponentModel.BackgroundWorker
        AddHandler bw.DoWork, AddressOf bwworkmain
        bw.RunWorkerAsync()

        'For i = 0 To 1535
        '    ' bw.RunWorkerAsync(i)
        'Next
    End Sub

    Private Sub bwworkmain(sender As Object, e As ComponentModel.DoWorkEventArgs)
        Dim c As New SlidertoSolidColorBrush
        Tasks.Parallel.For(0, 1535, Sub(i)
                                        GetImageBrush(i, CType(c.Convert(i, Nothing, Nothing, Nothing), SolidColorBrush).Color())
                                    End Sub)
    End Sub

    Private Sub GetImageBrush(ByVal i As Integer, ByVal c As Color)
        li.TryAdd(i, BlackWhiteColorGenerator(c))
    End Sub


    Public Function Convert(value As Object, targetType As System.Type, parameter As Object, culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.Convert
        If li.ContainsKey(value) Then
            Try
                Return li(value)
            Catch ex As Exception
                Return Nothing
            End Try
        Else
            Try
                Dim c As New SlidertoSolidColorBrush
                Dim z As ImageBrush = BlackWhiteColorGenerator(
                    CType(c.Convert(value, Nothing, Nothing, Nothing), SolidColorBrush).Color)
                Try
                    li.TryAdd(value, z)
                    Return z
                Catch ex As Exception
                    Return li(value)
                End Try
            Catch ex As Exception
                Return Nothing
            End Try
        End If
    End Function

    Public Function ConvertBack(value As Object, targetType As System.Type, parameter As Object, culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.ConvertBack
        Throw New NotImplementedException
    End Function

    Private Function BlackWhiteColorGenerator(ByVal Value As Color) As ImageBrush
       '
       'Code for Returns ImageBrush
    End Function

End Class

私が得るエラーは:Cannot use a DependencyObject that belongs to a different thread than its parent Freezable.

私はスレッドセーフ辞書、つまりConcurrentDictionaryを使用していますが、間違いがどこにあるか教えてください。また、このクラスは、WPFウィンドウでバインドされたコンバーターです。

4

1 に答える 1

0

エラーは非常に明確です。

Bgw/ParallelコードからGUIスレッドに「属する」DependencyObjectを使用しています。

これを並列化するときの問題は辞書だけではありません。

また、エラー処理のためにCompletedHandlerをbgwに追加することは常に良い習慣です。

于 2012-08-30T19:12:53.097 に答える