近日,应项目要求,需要定时执行一个更新任务。为了弘扬学习不馁精神,本人使用了两种方式进行实现,分别是:1、利用单线程,本博文重点内容。2、利用Oracle中的数据库连接(dbLink)先将两个数据库进行连接,之后通过存储过程进行实现,这个以后再写吧。今天呢,对单线程的实现方法进行详细说明下。
首先说明下环境,本次使用的是.Net Framework 2.0/Oracle 11g来完成,系统环境为Windows 10;
第二,下面对单线程实现功能的主要代码先贴出来再说;
1、首先为了代码的简洁和美观,以及使用起来方便,我们声明一个委托,并定义一个委托变量;
//声明委托
public delegate void UpdateTextDelegate(string msg,string option);
//定义委托变量
public UpdateTextDelegate UpdateText;
2、实例化委托,在窗体初始化时,将该委托进行实例化(委托实例化之后还是委托,和类不一样,类叫实例或者对象^_^);
//实例化委托
UpdateText = new UpdateTextDelegate(UpdateTextFunction);
3、由于该工具中只需要执行数据库更新和信息输出功能,所以委托函数如下:
/// <summary>
/// 委托函数
/// </summary>
/// <param name="msg"></param>
/// <param name="option"></param>
private void UpdateTextFunction(string msg, string option)
{
if (option == "information")
{
this.richTextBox1.AppendText(string.Format("{0}\r", msg));
//书写到日志
LogClass.WriteLog(msg);
}
else if (option == "end")
{
this.richTextBox1.AppendText(string.Format("{0}\r\n\r\n",msg));
//书写到日志
LogClass.WriteLog(msg);
}
else if(option == "run")
{
QueryRefer();
}
}
4、正主来了。上面说了,该工具是利用单线程 实现的,所以我们用到了System.Threading命名空间下的Timer和Thread,代码如下:
//线程中的定时器
timer = new System.Threading.Timer(new TimerCallback(timer_Tick), null, Convert.ToInt32(this.textBox2.Text) * 1000 * 60 * 60, Convert.ToInt32(this.textBox2.Text) * 1000 * 60 * 60);
timer.Change(0,Convert.ToInt32(this.textBox2.Text)*1000*60*60);
//线程声明 Thread thread = new Thread(new ThreadStart(delegate { StartWriteMsg(); })); thread.Name = "myupdateThread"; //线程启动 thread.Start();5、既然线程已经启动,那么就要考虑,在该线程上执行什么任务,该怎样执行;
this.BeginInvoke(UpdateText, "", "run");//在创建控件的基础句柄所在的线程上,用指定的参数异步指定委托
6、接下来呢,就是执行什么任务了,在这里我就不写了,上面的可以使用于任何任务当中。
中午了,吃饭不积极,思想有问题,哈哈,吃饭吃饭