私の質問が合理的であることを願っています!
(ThreadPool を使用して) 20 個のスレッドがValidateItem
メソッドを実行しているとします。
_validators = new Validators[] { new Validator1(), new Validator2(), ..., new ValidatorN() };
private void ValidateItem(string item)
{
var req = new ValidationRequest(item);
foreach (var validator in _validators)
{
//------(1)
res = validator.Validate(req);
OnValidatorCompletedEvent(item, res);
if (res.Type == ValidationResultType.Invalid)
{
break;
}
}
OnAllValidatorsCompletedEvent(item, res);
}
特定のバリデーターの検証を開始する前に、そのバリデーターの準備ができているかどうかを確認する必要があります。そうでなく、タイムアウトでもない場合は、後で再試行する必要があります。(1)に次のコードを追加することを考えました
while(!validator.IsReady && !(timedout > 5000))
{
Sleep(200);
timedout += 200;
}
しかし、20 個のスレッドすべてがここ (たとえば ) でスタックする可能性があるため、Validator10
20 個のスレッドすべてが代わりに待機し、その間、少なくとも から までの間、他のアイテムの検証を続行Validator1
しValidator9
ます。では、少なくとも他のアイテムの検証を継続できるようにするにはどうすればValidator1
よいValidator9
でしょValidator10
うか。