2

VS2012 で Async-Await をいじっていて、複数のスレッドを使用しているときに値をインクリメントしようとしました。

Interlocked.Increment を使用して i += 1 をスレッドセーフにするか、synclock を使用できることを知っています。

これにより、このコードが得られます。

    Imports System.Threading

Module Module1

    Private incre As New Incrementing

    Sub Main()
        Console.WriteLine("Starting")
        Const numberofthreads As Integer = 20
        Dim ts(numberofthreads) As Task(Of Integer)
        For i = 0 To numberofthreads
            ts(i) = count()
        Next
        Task.WaitAll(ts)
        For i = 0 To numberofthreads
            Console.WriteLine(ts(i).Result)
        Next
        Console.ReadLine()
    End Sub

    Async Function count() As Task(Of Integer)
        Await Task.Run(Sub()
                           For i = 1 To 1000
                               incre.Add()
                               Thread.Sleep(1)
                           Next
                       End Sub)
        Return incre.Read()
    End Function

    Public Class Incrementing
        Private i As Integer = 0

        Public Sub Add()
            Interlocked.Increment(i)
        End Sub

        Public Function Read() As Integer
            Return i
        End Function
    End Class
End Module

しかし、それはあまりきれいに見えません.Task.Runは奇妙に思えます. これを行うより良い方法はありますか?

スレッド化された方法の方が不格好ではなかったように私には思えます。

Imports System.Threading

Module Module1

    Private incre As New Incrementing

    Sub Main()
        For i = 0 To 20
            Dim t1 As New Thread(AddressOf count)
            t1.IsBackground = True
            t1.Start()
        Next
        Console.ReadLine()
    End Sub

    Sub count()
        For i = 1 To 1000
            incre.Add()
            Thread.Sleep(1)
        Next
        Console.WriteLine(incre.Read())
    End Sub

    Public Class Incrementing
        Private i As Integer = 0

        Public Sub Add()
            Interlocked.Increment(i)
        End Sub

        Public Function Read() As Integer
            Return i
        End Function
    End Class
End Module
4

0 に答える 0