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