私の目的は、CPUにバインドされた作業にスレッドプールスレッドを使用しないようにすることです。これにより、IISが新しい要求への応答を停止する状況を回避できます。
以下のコードに問題がありますか?これは安全でクリーンなアプローチですか?何か改善点はありますか?
private static ConcurrentQueue<Job> Jobs = new ConcurrentQueue<Job>();
static int threadCount = 0;
private void QueueJob(Job job)
{
lock(Jobs)
{
Jobs.Enqueue(job);
if (threadCount == 0)
{
Interlocked.Increment(ref threadCount);
var t= new Thread(new ThreadStart(ConsumeQueue));
t.Start();
}
}
}
private void ConsumeQueue()
{
while (true)
{
lock (Jobs)
{
if (!Jobs.Any())
{
Interlocked.Decrement(ref threadCount);
return;
}
}
Job j;
var jobToDo = Jobs.TryDequeue(out j);
if (jobToDo)
{
DoCPUBoundWork(j);
}
}
}