//应为要判断上一个操作是否完成!用异步调用!
//主线程中启动一个支线程,执行doSomething这样的一个方法。
Thread thread = new Thread(new ThreadStart (doSomething));
thread.IsBackground = true;//这样能随主程序一起结束
thread.Start();
//定义2个委托doSomething的方法中能用的到
delegate void Delegate_do();
public void doSomething()
{
try
{
Delegate_do Delegate_do = new Delegate_do(do1);
IAsyncResult result = Delegate_do.BeginInvoke(null, null);//str1,str2 是方法do1的参数
while (!result.IsCompleted)
{
Thread.Sleep(5000);// 每隔5秒判断一下是否完成
}
if (result.IsCompleted)
{
Thread.Sleep(1000 * 300); //休眠5分钟,进行下一轮操作
doSomething();
}
}
catch (Exception exc)
{
MessageBox.Show(exc.Message);
}
}
private void do1()
{
//从数据库中取DataSet然后判断处理后放到另一个数据库 的代码
//(此处省略3000行)
}
已经测试一下(自己手写的,怕有错误),可以使用了!在执行一次完成后,休眠5分钟再执行,下一次操作!
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Thread t = new Thread(new ThreadStart(xxx));
t.Start();
Console.ReadKey();
}
static void xxx()
{
Console.WriteLine("hello, world");
}
}
}
这是多线程
你这么写timer控件应该在主线程里的吧,那你对应的取数据操作也在主线程里呀,在取数据的时候就会卡一下。
可以不需要timer控件,我给你段代码,你根据实际情况改下:
定义委托:private delegate void ShowMsg(string strMsg);
private ShowMsg SM;
PageLoad时给委托实例化:SM += new ShowMsg(SetLabel);
委托方法:private void SetLabel(string strMsg)
{
this.label2.Text=strMsg;//这里可以更新你需要更新的控件
}
1.在主线程里创建取数据线程
Thread t1 = new Thread(new ThreadStart(ThreadFunc));
t1.Start();
2.取数据线程方法
private void ThreadFunc()
{
int i = 0;
while (true)//这里根据你情况自己换个条件也行
{
//这里负责取数据
i++;
this.Invoke(SM, "取数据次数:" + i.ToString());//使用委托,更新主线程中的控件值
Thread.Sleep(5000);//等5秒执行一次
}
}
这样就不会一卡一卡的了