回 帖 发 新 帖 刷新版面

主题:关于Timer的使用问题,有些事情需要请教?

VC#.Net中有两个Timer,在System.Windows.Form和System.Threading两个命名空间中都有一个Timer控件,使用System.Threading的Timer控件时,程序会创建一个新的线程,在这个新线程中,为何不能修改主窗体的TextBox中的值?应该怎样解决?

回复列表 (共2个回复)

沙发

不能跨线程访问Control对象。

可以写个方法和委托,来实现。

比如
private delegate void SetControlTextHandler(Control ctrl,string text);

private void SetControlText(Control ctrl,string text){
    if(ctrl.InvokeRequired){
        SetControlTextHandler h=new SetControlTextHandler(SetControlText);
        ctrl.BeginInvoke(h,ctrl,text);
    }else{
        ctrl.Text=text;
    }
}

有关跨线程访问的更多内容,参见msdn中的相关信息。

板凳


// page 273

using System;
using System.Timers;   // requied System.dll

//namespace ConApp5
//{
    class Clock
    {
        static int iStringLenth;

        [STAThread]
        static void Main( )
        {
            Console.WriteLine("Press Enter to end program");
            Console.WriteLine();

            Timers tmr = new Timer();
            tmr.Elapsed += new ElapsedEnentHandler(TimerHandler);
            tmr.Interval = 1000;
            tmr.Start();

            Console.ReadLine();
            tmr.Stop();
        }

        static void TimerHandler(object obj,ElapsedEventArgs eea)
        {
            Console.Write(new String('\b',iStringLenth));

            string str = String.Format("{0} {1}",eea.SignalTime.ToLongDateString(),
                                eea.SignalTime.ToLongTimeString());
            iStringLenth = str.Length;

            Console.Write(str);
        }
    }
//}
那我上面的代码由什么问题
为什么一直 tmr.Elapsed += new ElapsedEnentHandler(TimerHandler); 发生错误??

我来回复

您尚未登录,请登录后再回复。点此登录或注册