複数のスレッドを使用してアイテムリストを操作するコンソールアプリケーションがあります。これらのアイテムはすべてAPIにアクセスする必要があり、そのAPIに2回以上リクエストする必要はありません。複数のスレッドが同時に同じ関数にアクセスする
だから私はAPIリクエスト
Public Class apiRequest
Property lastRequest as date = now()
function doRequest()
'check if we can make a request
if Now.Substract(lastRequest).Seconds > 1 then
lastRequest = now()
'Do request [...]
end if
end function
End Class
を行うクラスを持っていると私は、メインプログラム
property apiRequester as new apiRequest
sub main
'start multiple threads (addressOf threadFunction)[...]
end sub
sub threadFunction()
dim data as string = apirequester.doRequest() 'Call the api request
end sub
しかし、どのような2つのスレッドが正確に同じ時間で要求を行う場合、彼らは、起こるを持っていますこれらの両方が最初に実行されるため、両方ともこの行を最初に実行するため、秒が過ぎてチェックされます。
if Now.Substract(lastRequest).Seconds > 1 then
この行に移動する
lastRequest = now()
1秒間に1回のリクエストしかないようにするには、どうすればapiRequest関数を作成できますか?
ソリューション
私はSyncLock
を使用して、次の解決策を見つけました。
Private locker As New Object
Private lastRequest as date = now()
function doRequest()
SyncLock locker
if Now.Substract(lastRequest).Seconds > 1 then
lastRequest = now()
end if
End Synclock
end function
これは、最終的にはモニターが解放されることを保証するために、(Visual Basicでは最後に...試してみてください)ブロック...試みで終了メソッドをラップし、ほぼそのロックとSyncLock除くdbasnettからMonitor.Enter
、Monitor.Exit
answerと同じように動作します(Alex Bがコメントに指摘されている)
代わりに[ConcurrentQueue](https://msdn.microsoft.com/en-us/library/dd267265(v = vs.110).aspx)に項目を追加し、それらをタイマーティック。あなたはいつでもリクエストを作成できますが、設定したレートで提出され、必要なものはロックされません。 –