검색을 시도했지만 내가 직면 한 문제에 가장 적합한 제안을 찾지 못했습니다.여러 리소스에 대한 Monitor.TryEnter
제 문제는 사용 가능한 리소스 (계산 엔진)의 목록/스택이 있다는 것입니다. 이러한 자원은 특정 계산을 수행하는 데 사용됩니다.
계산을 수행하라는 요청은 외부 프로세스에서 트리거됩니다. 따라서 계산 요청이있을 때 사용 가능한 리소스가 현재 다른 계산을 수행하지 않는지 확인해야합니다. 잠시 기다렸다가 다시 확인하십시오.
저는 이것을 구현하는 가장 좋은 방법이 무엇인지 궁금합니다. 다음 코드를 제 위치에두고 있지만 매우 안전한지 확실하지 않습니다. 당신이 더 제안이 있다면
, 즉 큰 것 :
void Process(int retries = 0) {
CalcEngineConnection connection = null;
bool securedConnection = false;
foreach (var calcEngineConnection in _connections) {
securedConnection = Monitor.TryEnter(calcEngineConnection);
if (securedConnection) {
connection = calcEngineConnection;
break;
}
}
if (securedConnection) {
//Dequeue the next request
var calcEnginePool = _pendingPool.Dequeue();
//Perform the operation and exit.
connection.RunCalc(calcEnginePool);
Monitor.Exit(connection);
}
else {
if (retries < 10)
retries += 1;
Thread.Sleep(200);
Process(retries);
}
}
감사합니다. Jon, Monitor를 사용하지 않을 경우 궁금한 점이 무엇입니까? –
정확한 시나리오를 알려주기 위해 특정 계산을 수행하는 연결 목록이 있으며 여러 소스에서 계산 요청 (어쩌면 동시에)이 표시됩니다. 제 의도는 이러한 요청 (_pendingPool)을 대기열에 넣고 계산이 트리거되는 즉시 사용 가능한 자원이 있는지 확인하고 각 요청을 대기열에서 제외하고 계산을 수행하는 것입니다. –
@UmeshNavani : 대기열에서 * 푸시 *하는 대신 연결에서 끌어낼 수있는 것처럼 들리 - 기본적으로 여러 소비자가있는 생산자/고객 대기열이 있습니다. .NET 4를 사용한다면,이 측면을 위해 설계된'BlockingCollection'을보십시오. 덕분에 –