线程池或TPL用于长时间运行的任务

3
我有一个Windows服务,它在长时间处理后发送电子邮件。该服务不断从数据库表中获取电子邮件数据,每当有表格条目并处理完毕后将其发送出去。
目前,这是一个多线程应用程序,在生产服务器上配置了线程数高达25个(仅用于此目的),因为它需要24x7x365运行。但我们只看到有2个活动线程正在运行。可能的原因是什么?
另外,我希望在这里使用线程池或TPL来更改线程代码。请您建议更好的处理此情况的方法?
提前致谢!
//以下是示例代码
    Thread[] threads;
    int ThreadCount = 25;
    private void StartProcess()
    {
        //Create new threads 
        if (Threads == null)
        {
            // Create array of threads based on the configuration
            threads = new Thread[ThreadCount];
            for (int i = 0; i < ThreadCount; i++)
            {
                Thread[] threads[i] = new Thread(new ThreadStart(SendEmail));
                threads[i].Start();
            }
        }
        else
        {
            resume it if exists
            for (int j = 0; j < threads.Length; j++)
            {
                if (threads[j].ThreadState == Threading.ThreadState.Suspended)
                {                        
                    threads[j].Resume();
                }
            }
        }
    }
   public void SendEmail()
    {
        while (Thread.CurrentThread.ThreadState == System.Threading.ThreadState.Running)
        {
              // send email code
            Thread.Sleep(duration);
        }
    }

3
你正在进行大量的IO工作,我完全看不出需要使用25个线程的原因。建议尝试使用SmtpClient.SendMailAsync和异步数据库端点。 - Yuval Itzchakov
2
TPL正在使用线程池。许多类将异步方法公开为任务,因此没有理由使用原始线程。 - Panagiotis Kanavos
请注意,Thread.Suspend不适用于生产环境。如果它恰好挂起了字符串的静态构造函数,那么您的进程将被卡住。您需要放弃使用它。 - usr
2
实际上,你想要解决什么问题?你有一堆邮件需要发送吗?为什么不使用BlockingCollection上的Parallel.ForEach?把所有这些代码都扔掉。 - usr
ActionBlock<T>是另一个不错的选择 - 它负责排队消息,通过简单的配置允许并发执行。 - Panagiotis Kanavos
1个回答

1
可能你没有看到 25 个线程的原因是线程方法 SendEmail 在线程状态改变时可能会退出。一旦它退出,该线程就消失了,无法恢复。我认为你可能想在那个 while 循环上使用一个不同的条件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接