我有一个线程负责入队,一个线程负责出队。但是,数据入队的频率远远超过出队+处理数据所需的时间。当我执行以下操作时,我最终在数据处理中遇到了巨大的延迟:
public void HandleData()
{
while (true)
{
try
{
if (Queue.Count > 0)
{
Queue.TryDequeue(out item);
ProcessData(item);
}
else
{
Thread.Sleep(10);
}
}
catch (Exception e)
{
//...
}
}
}
接下来我尝试在单独的任务中处理数据,但这最终影响了项目中的其他任务,因为这种处理最终占用了分配给应用程序的大部分资源并产生了高线程数。
public void HandleData()
{
while (true)
{
try
{
if (Queue.Count > 0)
{
Queue.TryDequeue(out item);
Task.Run(() => ProcessData(item));
}
else
{
Thread.Sleep(10);
}
}
catch (Exception e)
{
//
}
}
}
接下来,我尝试了以下方法:
public void HandleData()
{
List<Task> taskList = new List<Task>();
while (true)
{
try
{
if (Queue.Count > 0)
{
Queue.TryDequeue(out item);
if (taskList.Count <= 20)
{
Task t = Task.Run(() => ProcessData(item));
taskList.Add(t);
}
else
{
ProcessData(item);
}
}
else
{
Thread.Sleep(10);
}
taskList.RemoveAll(x => x.IsCompleted);
}
catch (Exception e)
{
//...
}
}
}
这似乎已经解决了这个问题,但我想知道是否有更清洁的方法来做到这一点?出队时设置最大并发线程数的方法?