应用线程并执行两项任务 [英] Applying threading and performing two tasks

查看:46
本文介绍了应用线程并执行两项任务的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

各位大家好,



我有一个控制台应用程序,我必须发送邮件,并且必须每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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆