应用线程并执行两项任务 [英] Applying threading and performing two tasks
本文介绍了应用线程并执行两项任务的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
各位大家好,
我有一个控制台应用程序,我必须发送邮件,并且必须每5分钟检索一次来自第三方的邮件统计信息。因为我必须发送更多数量的邮件,可能需要4-5个小时,我迫不及待想要完成它而不是开始获取统计数据。所以我必须每5分钟应用线程发送邮件和检索统计数据..
我已经为它制作了一个类文件
如何在此处使用计时器并将其设置为每隔5分钟触发一次
解决方案
请参阅MSDN线程教程 [ ^ ]
你应该创建两个线程,一个用于统计,一个用于统计发送电子邮件。
在你的代码中你应该有:
公共类SomeForm:表格
{
private Thread _sendEmailsThread;
private Thread _getStatisiticsThread;
protected void SomeUIEventMethod(...)
{
if(_sendEmailThread == null || _sendEmailThread.IsAlive == false)
{
_sendEmailsThread = new Thread(new ThreadStart(SendEmails));
_sendEmailThread.Start();
}
if(_getStatisiticsThread == null || _getStatisiticsThread.IsAlive == false)
{
_getStatisiticsThread = new Thread(new ThreadStart(GetStatisitics));
_getStatisiticsThread.Start();
}
}
private void SendEmails()
{
// ...您发送电子邮件的代码
}
private void GetStatisitics()
{
// ...获取统计数据的代码
}
protected void SomeForm_FormClosing(...)
{
if(_sendEmailThread!= null&& _sendEmailThread.IsAlive)
{
_sendEmailThread.Abort();
}
if(_getStatisiticsThread!= null&& _getStatisiticsThread.IsAlive)
{
_getStatisiticsThread.Abort();
}
// ...
}
}
您可以使用.net框架提供的后台工作组件来创建线程,因此您可以创建一个在继续执行时在不同线程中发送电子邮件的类。
排序的一个例子,
< br />
Public Class Email< br />
< br />
Private EmailWorker As New ComponentModel.BackgroundWorker< br />
< br />
Public Sub SendEmailsAsync( )< br />
EmailWorker.WorkerReportsProgress = True< br />
AddHandler EmailWorker.DoWork,AddressOf EmailWorker_DoWork< br />
AddHandler EmailWorker.ProgressChanged,AddressOf EmailWorker_ProgressChanged< br />
AddHandler EmailWorker.RunWorkerCompleted,AddressOf EmailWorker_Completed< br />
EmailWorker.RunWorkerAsync()< br />
End Sub< br />
< br />
Private Sub EmailWorker_Completed(发件人为对象,e为ComponentModel.RunWorkerCompletedEventArgs)< br />
'发送所有电子邮件后您想要做的任何事情< br />
End Sub< br / >
< br />
Private Sub EmailWorker_Progress已更改(发件人为对象,e为ComponentModel.ProgressChangedEventArgs)< br />
'进度,即如果您希望在每封电子邮件或类似内容之后进行任何记录< br />
End Sub< br />
< br />
Private Sub EmailWorker_DoWork(ByVal sender As Object,ByVal e As EventArgs)< br />
'编写代码以发送电子邮件< br />
EmailWorker.ReportProgress(1,string message)< br />
End Sub< br />
< br />
Hello everybody,
I have a console application from where I have to send mails and have to retrieve statistics about mail from third party at every 5 minutes. As I have to send more number of mails and it may take 4-5 hours, i can not wait to get it over and than start getting statistics. So I have to apply threading for sending mail and for retrieving statistics every 5 minutes..
I have made a class file for it
How can I use timer here and set it to trigger after every 5minutes
解决方案
See MSDN Threading Tutorial[^]
You should create two threads, one for statistics and one for sending emails.
In your code you should have:
public class SomeForm : Form { private Thread _sendEmailsThread; private Thread _getStatisiticsThread; protected void SomeUIEventMethod(...) { if(_sendEmailThread == null || _sendEmailThread.IsAlive == false) { _sendEmailsThread= new Thread(new ThreadStart(SendEmails)); _sendEmailThread.Start(); } if(_getStatisiticsThread== null || _getStatisiticsThread.IsAlive == false) { _getStatisiticsThread= new Thread(new ThreadStart(GetStatisitics)); _getStatisiticsThread.Start(); } } private void SendEmails() { //... your code for sending emails } private void GetStatisitics() { //... your code for getting statistics } protected void SomeForm_FormClosing(...) { if (_sendEmailThread!= null && _sendEmailThread.IsAlive) { _sendEmailThread.Abort(); } if (_getStatisiticsThread!= null && _getStatisiticsThread.IsAlive) { _getStatisiticsThread.Abort(); } //... } }
You can use background worker component provide by .net framework for creating threads and thus you can create a class which sends out emails in a diffrent thread while you continue with your execution.
An example of sort,
<br /> Public Class Email<br /> <br /> Private EmailWorker As New ComponentModel.BackgroundWorker<br /> <br /> Public Sub SendEmailsAsync() <br /> EmailWorker.WorkerReportsProgress = True<br /> AddHandler EmailWorker.DoWork, AddressOf EmailWorker_DoWork<br /> AddHandler EmailWorker.ProgressChanged, AddressOf EmailWorker_ProgressChanged<br /> AddHandler EmailWorker.RunWorkerCompleted, AddressOf EmailWorker_Completed<br /> EmailWorker.RunWorkerAsync()<br /> End Sub<br /> <br /> Private Sub EmailWorker_Completed(sender As Object, e As ComponentModel.RunWorkerCompletedEventArgs)<br /> ' Anything you wish to do after all the emails are sent <br /> End Sub<br /> <br /> Private Sub EmailWorker_ProgressChanged(sender As Object, e As ComponentModel.ProgressChangedEventArgs)<br /> ' Progress i.e if you wish to have any logging after each email or somthing similar <br /> End Sub<br /> <br /> Private Sub EmailWorker_DoWork(ByVal sender As Object, ByVal e As EventArgs)<br /> ' Write Your Code to Send Emails <br /> EmailWorker.ReportProgress(1,string message )<br /> End Sub<br /> <br />
这篇关于应用线程并执行两项任务的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文