代码:
class Trans
{
public delegate void myDlg(string s);
public event myDlg myEvent; private System.Timers.Timer myTimer; public Trans()
{
myTimer =new System.Timers.Timer(3000);
myTimer.Elapsed +=new System.Timers.ElapsedEventHandler(myTimer_Elapsed);
myTimer.Enabled = true;
} private void myTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
myTimer.Enabled = false; string s = "xxxx";
System.Threading.Timer timer = new System.Threading.Timer(new TimerCallback(ReceiveThread),s,0,0); myTimer.Enabled = true;
} private void ReceiveThread(object s)
{
if (this.myEvent != null)
this.myEvent(System.Convert.ToString(s));
}
}========================================================================================= class Manager
{
public Manager()
{
Trans trans = new Trans();
trans.myEvent += new Trans.myDlg(trans_myEvent);
} private void trans_myEvent(string s)
{
Console.WriteLine(s);
}
}========================================================================================= class Program
{
static void Main(string[] args)
{
Manager m = new Manager();
Thread.Sleep(10000);
}
}=========================================================================================我的理解是,既然new了一个System.Threading.Timer,那它就应该在自己单独的线程中运行,又由于new的时候最后一个参数为0,它不是应该不断运行吗?它应该和myTimer无关吧,为什么它是隔3秒输出一个“xxxx"呢?希望大家帮帮忙啊。
class Trans
{
public delegate void myDlg(string s);
public event myDlg myEvent; private System.Timers.Timer myTimer; public Trans()
{
myTimer =new System.Timers.Timer(3000);
myTimer.Elapsed +=new System.Timers.ElapsedEventHandler(myTimer_Elapsed);
myTimer.Enabled = true;
} private void myTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
myTimer.Enabled = false; string s = "xxxx";
System.Threading.Timer timer = new System.Threading.Timer(new TimerCallback(ReceiveThread),s,0,0); myTimer.Enabled = true;
} private void ReceiveThread(object s)
{
if (this.myEvent != null)
this.myEvent(System.Convert.ToString(s));
}
}========================================================================================= class Manager
{
public Manager()
{
Trans trans = new Trans();
trans.myEvent += new Trans.myDlg(trans_myEvent);
} private void trans_myEvent(string s)
{
Console.WriteLine(s);
}
}========================================================================================= class Program
{
static void Main(string[] args)
{
Manager m = new Manager();
Thread.Sleep(10000);
}
}=========================================================================================我的理解是,既然new了一个System.Threading.Timer,那它就应该在自己单独的线程中运行,又由于new的时候最后一个参数为0,它不是应该不断运行吗?它应该和myTimer无关吧,为什么它是隔3秒输出一个“xxxx"呢?希望大家帮帮忙啊。
3秒是这的。
System.Threading.Timer timer = new System.Threading.Timer(new TimerCallback(ReceiveThread),s,0,0);
如果 dueTime 为零 (0),则立即调用 callback。如果 dueTime 为 Timeout.Infinite,则不会调用 callback;计时器将被禁用,但通过调用 Change 方法可以重新启用计时器。如果 period 为零 (0) 或 Infinite,并且 dueTime 不是 Infinite,则只会调用一次 callback;计时器的定期行为将被禁用,但使用 Change 方法可以重新启用该行为。
如果 period 为零 (0) 或 Infinite,并且 dueTime 不是 Infinite,则只会调用一次 callback;计时器的定期行为将被禁用,但使用 Change 方法可以重新启用该行为。====================================
多谢,我原以为period为0就是不停地调用。另外,我还想知道,主线程sleep10秒后就结束,那System.Threading.Timer对象自己的线程也跟着结束了是吗?还是在执行完ReceiveThread()方法就结束了?还有,每隔几秒就new一个System.Threading.Timer,到时候不就产生了好多线程了吗?
应该是执行完ReceiveThread()后结束,如果这个方法没写好,就可能造成结束不了。还有,每隔几秒就new一个System.Threading.Timer,到时候不就产生了好多线程了吗?
是会这样,但因为没有对它们的引用了,每隔一段时间就会被GC回收。