请教C#中线程和System.Threading.Timer类的简单问题

kissknife 2006-03-31 09:49:44
代码:
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"呢?希望大家帮帮忙啊。
...全文
1647 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
hdj_05 2006-04-03
  • 打赏
  • 举报
回复
学习!
kissknife 2006-03-31
  • 打赏
  • 举报
回复
原来如此,多谢soaringbird(飞翔鸟)。虽然对回收机制还不太明白。
soaringbird 2006-03-31
  • 打赏
  • 举报
回复
另外,我还想知道,主线程sleep10秒后就结束,那System.Threading.Timer对象自己的线程也跟着结束了是吗?还是在执行完ReceiveThread()方法就结束了?
应该是执行完ReceiveThread()后结束,如果这个方法没写好,就可能造成结束不了。

还有,每隔几秒就new一个System.Threading.Timer,到时候不就产生了好多线程了吗?
是会这样,但因为没有对它们的引用了,每隔一段时间就会被GC回收。
kissknife 2006-03-31
  • 打赏
  • 举报
回复
soaringbird(飞翔鸟):
如果 period 为零 (0) 或 Infinite,并且 dueTime 不是 Infinite,则只会调用一次 callback;计时器的定期行为将被禁用,但使用 Change 方法可以重新启用该行为。

====================================
多谢,我原以为period为0就是不停地调用。

另外,我还想知道,主线程sleep10秒后就结束,那System.Threading.Timer对象自己的线程也跟着结束了是吗?还是在执行完ReceiveThread()方法就结束了?

还有,每隔几秒就new一个System.Threading.Timer,到时候不就产生了好多线程了吗?
soaringbird 2006-03-31
  • 打赏
  • 举报
回复
myTimer =new System.Timers.Timer(3000);
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 方法可以重新启用该行为。

110,548

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧