1

と である多くのプロパティを持つクラスがIntegerありSingleます。プロパティをアキュムレータとして使用できるように、クラスをマルチスレッドで使用したいと考えています (クラスはレポート スキームの基盤です)。だから私はこのようなことをしたいと思います:

Public Class ReportTotals
    Property Count As Integer
    Property Total As Single
    Property Tax As Single
    Property Shipping As Single
    Property ItemsSold As Integer

    Public Function GetReport() As String
    ...
    End Function
End Class

Public Function BuildReportData As ReportTotals

    Dim myReport As New ReportTotals
    With myReport
        Parallel.ForEach(UserSales, Sub(userSale)
                .Count += 1
                .Total += userSale.Total
                .Tax += userSale.Tax
                .Shipping += userSale.Shipping
                .ItemsSold += userSale.ItemsSold

                'more complicated stuff and property assignments

            End Sub)
    End With
End Function

私の調査に基づいて、IntegerSingleがアトミックであることはわかっていますが、それがクラスの一部である整数にまで及ぶかどうかはわかりません。マルチスレッドのバグが後で発生し、私を噛む可能性があるため、想定したくありません。

更新:どうやら、Singleスレッドセーフではないので、そのロックを使用する必要がありますが、どうIntegerですか?

4

4 に答える 4

3

Interlocked.Incrementを使用して、整数がクラス メンバーであってもアトミックにインクリメントできます。

于 2013-04-22T20:51:58.840 に答える
1

これは、 local state で動作するオーバーロードのParallel.ForEach()ように聞こえます。

デリゲートではlocalInit、の新しいインスタンスを作成し、ロックの下でローカルの値をグローバルの値に追加しますReportTotalslocalFinallyReportTotals

于 2013-04-22T22:26:11.833 に答える
0

私がやろうと決めたのは、少なくとも誰かがより良いアイデアを思い付くまではReportTotals、ルーチンでたくさんのオブジェクトを作成Parallel.ForEachし、それらをすべて に入れることConcurrentBagです。次に、Parallel.ForEachステートメントが終了したら、通常のステートメントを使用して、オブジェクト内のすべての値を新しいオブジェクトFor Eachに蓄積し、それを返します。ReportTotalsConcurrentBagReportTotals

だから私はこのようなことをしています:

Public Class ReportTotals
    Property Count As Integer
    Property Total As Single
    Property Tax As Single
    Property Shipping As Single
    Property ItemsSold As Integer

    Public Function GetReport() As String
    ...
    End Function
End Class

Public Function BuildReportData As ReportTotals

    Dim myReport As New ReportTotals
    Dim myReports As New ConcurrentBag(Of ReportTotals)

    Paralle.ForEach(UserSales, Sub(userSale)
            Dim workingReport As New ReportTotals
            With workingReport
                .Count += 1
                .Total += userSale.Total
                .Tax += userSale.Tax
                .Shipping += userSale.Shipping
                .ItemsSold += userSale.ItemsSold

                'more complicated stuff and property assignments

            End With
        End Sub)

    For Each report In myReports 
        With myReport
            .Count += report.Count
            .Total += report.Total
            .Tax += report.Tax
            .Shipping += report.Shipping
            .ItemsSold += report.ItemsSold
        End With
    Next

    Return myReport
End Function
于 2013-04-22T22:07:54.687 に答える
0

多分SyncLockはあなたが探しているものです。

 Public Sub sale(s As String)
     SyncLock _lock
          //'thread safe code'
     End SyncLock
 End Sub

 Public Function BuildReportData as ReportTotals

 Dim myReport As New ReportTotals
 With myReport
     Parallel.ForEach(UserSales, sale(userSale))

 End Function
于 2013-04-22T21:02:04.043 に答える