다중 스레드로 채울 수있는 작업 대기열이 있습니다 (ConcurrentQueue<MyJob>
). 이 작업을 비동기 적으로 (주 스레드가 아닌) 연속 실행하도록 구현해야하지만 은 동시에 하나의 스레드 만 사용해야합니다.작업의 다중 스레드 대기열
public class ConcurrentLoop {
private static ConcurrentQueue<MyJob> _concurrentQueue = new ConcurrentQueue<MyJob>();
private static Task _currentTask;
private static object _lock = new object();
public static void QueueJob(Job job)
{
_concurrentQueue.Enqueue(job);
checkLoop();
}
private static void checkLoop()
{
if (_currentTask == null || _currentTask.IsCompleted)
{
lock (_lock)
{
if (_currentTask == null || _currentTask.IsCompleted)
{
_currentTask = Task.Run(() =>
{
MyJob current;
while(_concurrentQueue.TryDequeue(out current))
//Do something
});
}
}
}
}
}
내 생각에이 코드는 문제가 : 나는 이런 식으로 뭔가를 시도했습니다 작업 끝내지 않고 실행하는 경우 (아직 완료로 TryDequeue
false를 반환하지만 작업이 표시되지 않은)이 순간에 나는를 얻을 수 새로운 직업, 그것은 실행되지 않습니다. 내가 맞습니까? 그렇다면이 문제를 해결하는 방법
스레드 수를 제한하려는 실제 이유가 있습니까? 대부분의 경우 프레임 워크가 최적화를 처리하도록하는 것이 좋습니다. – konkked
한 번에 하나의 스레드가 실행하려는 코드 블록에 Lock을 사용하십시오. 이렇게하면 문제가 해결됩니다. – Reddy
'ConcurrentQueue'로 잠근다 고요? 나는 거기에 더 좋은 방법이 있다고 믿는다. – xalz