質問にタグを付けたのでazure-webjobs-sdk
、SDK について数日前に別の質問があったことを覚えています。Web ジョブが SDK を使用しており、トリガーされた関数を並行して実行しているという事実が原因でマルチスレッドが発生していると思います。
私の答えの最初の部分は、必ずしも Web ジョブに関連するものではありません。
class Program
{
private static MyService _service;
private static int _counter;
private static readonly object _lock = new object();
// The 3 blocks of code are thread safe by themselves
// but put together, there is no guarantee. Avoid
// multiple locks if you can
private static void Method1()
{
// 1. You can use a lock
lock(_lock)
{
// All the code here will be executed by a single thread.
// If another thread tries to get the lock, it will have
// to wait until the lock is released
_service.DoSomething();
}
// 2. For atomic operations you can use Interlocked
Interlocked.Increment(ref _counter);
// 3. For conditional locking
if (_service.SomeBooleanProperty)
{
lock(_lock)
{
// Check again to see the condition still holds
// because it might have changed between the
// execution of the first if and the lock
if (_service.SomeBooleanProperty)
{
// Execute the non thread safe code
}
}
}
}
}
Interlockedクラスへの参照
今、私は WebJobs SDK について話している:
処理の並行性を制御する場合は、プロパティを設定できQueue.BatchSize
ます。デフォルトでは 16 です。1 に設定すると、すべてが順次実行されます。こちらのリファレンスを参照してください。複数インスタンスの同時実行 (同じジョブの複数のインスタンス) で同時実行の問題が発生している場合は、BLOB リースが最適です。