【发布时间】:2017-10-20 16:24:56
【问题描述】:
我正在处理一个基于繁重线程的处理,每个任务仅在 10 秒后轮到它。我正在寻求提高性能,所以需要一些建议,如何改进以下代码库。
public void StartAllListerner()
{
foreach (tblUserMaster item in tblUserMasterBL.Instance.GetMany(new dbEntities()))
{
StartListenerProcess(item.ShoretelUserId, item.UserDN);
}
}
public void StartListenerProcess()
{
Task.Run(() =>
{
TrackIncomingRequest();
});
}
public void TrackIncomingRequest()
{
do
{
if(current thread gets event)
{
foreach(var item in allEvents)
{
// Some unending heavy activity, which is running continuously in background
}
}
} while (true);
}
基于当前的代码库,只有当线程得到一些事件时才会进行处理,否则它只是不断地等待事件发生。
那么,我们如何在 C# 中运行并行任务?
【问题讨论】:
-
为什么需要并行创建任务?如果你追求
Parallel.ForEach使用的分区器,直接使用会更清晰一些。 -
我建议在 Code Review 堆栈交换中提出这个问题:codereview.stackexchange.com 在这里您可以询问人们如何最好地优化您的代码 :)
-
为什么在
StartListenerProcess中使用Task.Run?Parallel.ForEach已经给了它一个线程。您真的需要再次使用新的Task吗? -
根据提供的代码,我猜您正在使用忙等待。它不会很好地扩展;你让线程忙着坐着什么也不做。而是使用任何信号结构,如
WaitHandle。或async versions of waithandle by stephen toub -
@smoksnes,更糟糕的是:
Parallel.ForEach不保证给它一个线程。允许等待其中一项任务完成后再开始另一项任务。