C#的委托机制可以将一个新线程中的函数发送到窗体建立的线程中运行,使用委托之后,调用的函数会在窗体所在线程中当前执行的函数结束后执行。测试如下
为了计时,先建立一个计时类TicToc,代码如下
using System;
namespace Utility
{
public static class TicToc
{
static private long timeStart;
public static void Tic()
{
timeStart = DateTime.Now.ToUniversalTime().Ticks;
}
// toc 调用一次1ms
public static double Toc(string text)
{
double timeSpan = (double)((DateTime.Now.ToUniversalTime().Ticks - timeStart)) / 10000;
if (text != "")
Console.WriteLine(text + "---" + "time elapsed: " + timeSpan.ToString() + " ms");
else
Console.WriteLine("time elapsed: " + timeSpan.ToString() + " ms");
return timeSpan;
}
public static double Toc()
{
return Toc("");
}
}
}
在主窗口中加入测试代码
delegate void AAA();
private void Aaa()
{
Invoke(new AAA(Bbb));
//Bbb();
Thread.Sleep(1000);
TicToc.Toc("ddd");
}
private void Bbb()
{
Thread.Sleep(5000);
TicToc.Toc("bbb");
}
在任意一个控件的事件响应代码中加入下段
new Thread(Aaa).Start();
TicToc.Tic();
TicToc.Toc("aaa");
Thread.Sleep(2000);
TicToc.Toc("ccc");
在Aaa()中通过委托调用Bbb的话,则打印出ccc时过去7000ms,在Aaa中直接调用Bbb的话,则打印出ccc时过去5000ms。
而不论使用委托与否,Aaa中的后续执行都要等Bbb执行完才进行,两种情况下ddd分别是在8000ms和6000ms时打印出。