【问题标题】:Timer usage in Thread Pool线程池中的定时器使用
【发布时间】:2011-03-04 16:17:50
【问题描述】:

我正在为我的公司开发一个在服务器上运行的 Windows 应用程序。它是一个多线程应用程序,我为此使用线程池。

我的应用程序电子邮件模块由 3 个主要方法组成。第一种方法从数据库中获取新的活动,第二种方法决定活动将通过电子邮件发送给谁,第三种方法将其发送。

当我启动应用程序时,第一个方法进入线程池,如果有新的活动,则使用活动信息调用第二个方法。但是当这些都发生时,第一种方法必须每三秒检查一次数据库是否有新的活动。

我不确定是否必须为此使用 System.Windows.Forms.Timer 类或 System.Threading.Timer??

我不知道如何实现它?我要使用 Invoke Function 在主 UI 之外调用线程吗?您能否发布示例代码并建议最佳实践? 非常感谢

这是我的代码:

private void btnStart_MouseClick(object sender, MouseEventArgs e)
    {
        smartThreadPool = new SmartThreadPool();
        workItemGroup = smartThreadPool.CreateWorkItemsGroup(1);
        workItemGroup.QueueWorkItem(CheckNewCampaigns);
        //smartThreadPool.QueueWorkItem(new WorkItemCallback(this.CheckNewCampaigns));            
    }

    private object CheckNewCampaigns(object state) // 1st method
    {
        StringBuilder builder = new StringBuilder();
        IEnumerable<Campaigns> CampaignsList = DatabaseManager.GetCampaignsList(DatabaseManager.GetNewCampaigns());

        foreach (Campaigns Campaign in CampaignsList)
        {
            builder.AppendFormat("New Campaign Arrived($) --> {0}\r\n", DateTime.Now.ToLongTimeString());
            builder.AppendFormat("CampaignID              --> {0}\r\n", Campaign.CampaignID);
            builder.AppendFormat("CustomerID              --> {0}\r\n", Campaign.CustomerID);
            builder.AppendFormat("ClientID                --> {0}\r\n", Campaign.ClientID);
            builder.AppendFormat("Title                   --> {0}\r\n", Campaign.Title);
            builder.AppendFormat("Subject                 --> {0}\r\n", Campaign.Subject);
            builder.AppendFormat("Status              --> {0}\r\n", Campaign.Status);
        }

        Console.WriteLine(builder.ToString());

        workItemGroup.QueueWorkItem(new WorkItemCallback(this.PrepareCampaignEmail), 2);
        return true;
    }

    private object PrepareCampaignEmail(object CampaignID)  // Second Method
    {
        int campaignID = (int)CampaignID;
        IEnumerable<Campaigns> CampaignDetailsList = DatabaseManager.GetCampaignsList(DatabaseManager.GetCampaignDetails(campaignID)); // bir tane campaign gelmekte
        IEnumerable<Subscribers> SubscribersList = DatabaseManager.GetCampaignSubscribersList(DatabaseManager.GetCampaignSubscribers(campaignID));
        ArrayList test = new ArrayList();

        DataTable dtCustomValuesForCampaign = DatabaseManager.GetCustomValuesForCampaign(campaignID);

        foreach (Subscribers subscriber in SubscribersList)
        {
            workItemGroup.QueueWorkItem(new WorkItemCallback(this.SendEmail), subscriber.Email);
        }

        return true;
    }

【问题讨论】:

标签: c# winforms multithreading timer threadpool


【解决方案1】:

在您的情况下,由于它是一个 Windows 窗体应用程序,并且您可能希望在计时器事件处理程序中更新 UI,我建议使用 Windows.Forms.Timer

使用Windows.Forms.Timer 非常简单。在表单的设计视图中,从工具箱中选择 Timer 并将其拖放到表单上。然后,单击它以设置属性。您想将Interval 设置为3000(即3000 毫秒),并将Enabled 设置为False

在“事件”选项卡上,双击 Tick 事件,IDE 将为您创建一个处理程序。您希望事件处理程序看起来像这样:

private void timer1_Tick(object sender, EventArgs e)
{
    var stateObj = // create your state object here
    CheckNewCampaigns(stateObj);
}

您需要启动计时器(将Enabled 设置为True)。您可以在 Create 事件处理程序中执行此操作,或者您可以在用户点击“开始”按钮时启用它。您也可以通过将Enabled 设置为False 随时停止它。

【讨论】:

    【解决方案2】:

    System.Thread.TimerWindows.Forms.Timer 行为不同。

    System.Thread.Timer 将在 系统 线程上运行。它有一个内部线程池,因此它不会在您明确创建的线程之一上运行。每个时间间隔,Timer 池中的一个线程都会运行您初始化对象时使用的回调。

    Windows.Forms.Timer 将在 当前 线程上引发 Tick 事件,并且会在每个时间间隔这样做,直到您禁用它为止。

    我不能告诉你哪个更适合你的情况;这取决于您是否要在 UI 线程上运行计时器,以及其他因素。

    【讨论】:

    • 定时器只影响一种方法。我认为使用 Windows.Forms.Timer 在当前线程上创建计时器会更好
    【解决方案3】:

    试试这个:

    public void EnableTimer()
            {
                if (this.InvokeRequired)
                    this.Invoke(new Action(EnableTimer));
                else
                    this.timer1.Enabled = true;
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-08
      • 2011-07-14
      • 2011-09-30
      • 1970-01-01
      • 2019-08-18
      • 1970-01-01
      • 2020-12-25
      • 1970-01-01
      相关资源
      最近更新 更多