【发布时间】: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;
}
【问题讨论】:
-
还有System.Timers.Timer! (以及 WPF 中的 System.Windows.Threading.DispatchTimer)查看此 question 及其答案,以消除对所有这些计时器的任何困惑。
-
你试过system.Threading.timer msdn.microsoft.com/en-us/library/system.threading.timer.aspx
标签: c# winforms multithreading timer threadpool