【问题标题】:Parallel thread processing in C#C#中的并行线程处理
【发布时间】: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.RunParallel.ForEach 已经给了它一个线程。您真的需要再次使用新的Task 吗?
  • 根据提供的代码,我猜您正在使用忙等待。它不会很好地扩展;你让线程忙着坐着什么也不做。而是使用任何信号结构,如WaitHandle。或async versions of waithandle by stephen toub
  • @smoksnes,更糟糕的是:Parallel.ForEach 不保证给它一个线程。允许等待其中一项任务完成后再开始另一项任务。

标签: c# task


【解决方案1】:

试试这样的:

public void TrackIncomingRequest()
{
    do
    {
        if(current thread gets event) 
        {   
            Parallel.Foreach(allEvents, (item) =>
            {
               // Some unending heavy activity, which is running continuously in background
            });
        }
    } while (true);
} 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多