积极答复者
在线程中调用timer控件,为什么timer控件不能启用

问题
-
NetworkStream ns;
private void button1_Click(object sender, EventArgs e)
{
TcpListener listener = new TcpListener(1314);
listener.Start();
TcpClient tclient = listener.AcceptTcpClient();
ns = tclient.GetStream();
Thread td = new Thread(new ThreadStart(Fun));
td.Start();
}private void Fun()
{
byte[] bt = new byte[1024];
while (true)
{
int i = ns.Read(bt, 0, bt.Length);
string s = Encoding.UTF8.GetString(bt, 0, i);
string[] a = s.Split('-');
if (a[0]=="GB")
{
this.timer1.Enabled = true;
MessageBox.Show("禁用成功");
}
}
}private void timer1_Tick(object sender, EventArgs e)
{
System.Diagnostics.Process[] p = System.Diagnostics.Process.GetProcessesByName("cmd");
for (int i = 0; i < p.Length; i++)
{
p[i].Kill();
}
}此代码是通过不断接收从客户端发过来的命令判断是否启用timer控件,但为什么接收到“GB”还是不能启用timer控件?
答案
-
您好,
根据你的代码你是用的Sytem.Windows.Forms.Timer类的一个实例吧, 该实例适合于单线程的环境。根据你的情况我觉得你使用Sytem.Timers.Timer类更加合适, 该类适合多线程的环境。
我试过一下代码:
private void button2_Click(object sender, EventArgs e) { Thread t = new Thread(new ThreadStart(work)); t.Start(); } private void work() { System.Timers.Timer timer = new System.Timers.Timer(); timer.Interval = 500; timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed); timer.Enabled = true; } void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { Console.WriteLine("Test"); }
当我把上述代码的timer实例改成Sytem.Windows.Forms.Timer类的一个实例时, 如你所说的就不能工作了. 所以你可以试试把你的timer实例改成Sytem.Timers.Timer类的一个实例。谢谢
Vin Jin [MSFT]
MSDN Community Support | Feedback to us
Get or Request Code Sample from Microsoft
Please remember to mark the replies as answers if they help and unmark them if they provide no help.
- 已标记为答案 happySnow_zhe 2011年6月6日 11:54
- 取消答案标记 happySnow_zhe 2011年6月6日 11:54
- 已标记为答案 肖小勇Moderator 2011年6月7日 5:01
-
您好,
关于Sytem.Windows.Forms.Timer类和Sytem.Timers.Timer类的区别和用法你可以参考如下链接:
Sytem.Windows.Forms.Timer : http://msdn.microsoft.com/zh-cn/library/system.windows.forms.timer(VS.80).aspx
Sytem.Timers.Timer类 : http://msdn.microsoft.com/zh-cn/library/system.timers.timer.aspx
在第一个链接中上面写到:
Timer 用于以用户定义的事件间隔触发事件。 Windows 计时器是为单线程环境设计的,其中,UI 线程用于执行处理。 它要求用户代码有一个可用的 UI 消息泵,而且总是在同一个线程中操作,或者将调用封送到另一个线程。
所以说Sytem.Windows.Forms.Timer是工作在UI线程上的。 而你的例子并不是, 你把Timer实例工作在了另外一个你自己创建的Thread中而不是UI线程中。这就解释了为什么不能工作的原因。
Vin Jin [MSFT]
MSDN Community Support | Feedback to us
Get or Request Code Sample from Microsoft
Please remember to mark the replies as answers if they help and unmark them if they provide no help.
- 已标记为答案 肖小勇Moderator 2011年6月7日 5:01
全部回复
-
您好,
根据你的代码你是用的Sytem.Windows.Forms.Timer类的一个实例吧, 该实例适合于单线程的环境。根据你的情况我觉得你使用Sytem.Timers.Timer类更加合适, 该类适合多线程的环境。
我试过一下代码:
private void button2_Click(object sender, EventArgs e) { Thread t = new Thread(new ThreadStart(work)); t.Start(); } private void work() { System.Timers.Timer timer = new System.Timers.Timer(); timer.Interval = 500; timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed); timer.Enabled = true; } void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { Console.WriteLine("Test"); }
当我把上述代码的timer实例改成Sytem.Windows.Forms.Timer类的一个实例时, 如你所说的就不能工作了. 所以你可以试试把你的timer实例改成Sytem.Timers.Timer类的一个实例。谢谢
Vin Jin [MSFT]
MSDN Community Support | Feedback to us
Get or Request Code Sample from Microsoft
Please remember to mark the replies as answers if they help and unmark them if they provide no help.
- 已标记为答案 happySnow_zhe 2011年6月6日 11:54
- 取消答案标记 happySnow_zhe 2011年6月6日 11:54
- 已标记为答案 肖小勇Moderator 2011年6月7日 5:01
-
您好,
关于Sytem.Windows.Forms.Timer类和Sytem.Timers.Timer类的区别和用法你可以参考如下链接:
Sytem.Windows.Forms.Timer : http://msdn.microsoft.com/zh-cn/library/system.windows.forms.timer(VS.80).aspx
Sytem.Timers.Timer类 : http://msdn.microsoft.com/zh-cn/library/system.timers.timer.aspx
在第一个链接中上面写到:
Timer 用于以用户定义的事件间隔触发事件。 Windows 计时器是为单线程环境设计的,其中,UI 线程用于执行处理。 它要求用户代码有一个可用的 UI 消息泵,而且总是在同一个线程中操作,或者将调用封送到另一个线程。
所以说Sytem.Windows.Forms.Timer是工作在UI线程上的。 而你的例子并不是, 你把Timer实例工作在了另外一个你自己创建的Thread中而不是UI线程中。这就解释了为什么不能工作的原因。
Vin Jin [MSFT]
MSDN Community Support | Feedback to us
Get or Request Code Sample from Microsoft
Please remember to mark the replies as answers if they help and unmark them if they provide no help.
- 已标记为答案 肖小勇Moderator 2011年6月7日 5:01