问题描述
问个问题,c#中,运行起来一个winform程序,点击连接按钮,启动一个定时器,这个定时器每0.1秒去执行一个方法。在点击连接之后,我还想按其他按钮,执行其他方法,但由于定时器里面的方法正在运行,所以点击其他按钮,执行其他方法时比较卡,所以我想弄两个线程,一个线程去执行定时器的方法,一个线程执行其他按钮的方法,,,没学过c#的多线程,求帮忙,求思路。。。。
解决方案
解决方案二:
timer根本就不是线程,你先把这个概念顺过来你那种就要开Thread
解决方案三:
组件的Timer压根就不是多线程,纯粹的UI组件不卡才怪,很多都喜欢用这个,实质上这个效率差,且性能不佳用这个System.Threading.Timer这个就是本质多线程,而且灵活,采用的是后台线程池线程操作。处理好可以解决界面卡的问题
解决方案四:
我没说timer是线程啊。。timer当然不是线程啦。要是这点我不知道的话,那就没必要问这个问题了。我想在timer里面写一个线程。。。引用2楼的回复:
组件的Timer压根就不是多线程,纯粹的UI组件不卡才怪,很多都喜欢用这个,实质上这个效率差,且性能不佳用这个System.Threading.Timer这个就是本质多线程,而且灵活,采用的是后台线程池线程操作。处理好可以解决界面卡的问题
解决方案五:
引用3楼的回复:
我没说timer是线程啊。。timer当然不是线程啦。要是这点我不知道的话,那就没必要问这个问题了。我想在timer里面写一个线程。。。引用2楼的回复:组件的Timer压根就不是多线程,纯粹的UI组件不卡才怪,很多都喜欢用这个,实质上这个效率差,且性能不佳用这个System.Threading.Timer这个就是本质多线程,而且灵活,采用的是后台线程池线程操作。处理……
那就看回复System.Threading.Timer是多线程
解决方案六:
使用System.Threading.Timer://注意!!!://这个Timer必须使用全局变量,如果声明成局部变量的话,只会执行一次,就被GC回收了privateSystem.Threading.Timer_timer=null;privatevoidMyMethod(objectstate){//dosomething}privatevoidStartTimer(){constintperid=100;//100msif(_timer==null)_timer=newTimer(MyMethod,null,0,perid);else_timer.Change(0,perid);}
解决方案七:
newSystem.Threading.Timer(showCarVideo,null,0,perid);我是这样写的,showCarVideo是我的方法,为什么会报错呢?参数无效。。。引用5楼的回复:
使用System.Threading.Timer:C#code//注意!!!://这个Timer必须使用全局变量,如果声明成局部变量的话,只会执行一次,就被GC回收了privateSystem.Threading.Timer_timer=null;privatevoidMyMethod(objectstate……
解决方案八:
newSystem.Threading.Timer(showCarVideo,null,0,perid);我是这样写的,showCarVideo是我的方法,为什么会报错呢?参数无效。。。引用5楼的回复:
使用System.Threading.Timer:C#code//注意!!!://这个Timer必须使用全局变量,如果声明成局部变量的话,只会执行一次,就被GC回收了privateSystem.Threading.Timer_timer=null;privatevoidMyMethod(objectstate……
解决方案九:
要使用这个timer,你的showCarVideo这个方法必须带一个(objectobj)的参数,即便你不用,也必须要写喔。
解决方案十:
类似的场景有两种:一种是每隔一段时间执行一次某个操作。另一种是执行一次操作后,间隔一段时间再执行下一次操作。第一种场景使用timer较佳,而第二种情况推荐使用while(true){//DoSomethingThread.Sleep(100);}示例:一、使用timerprivateSystem.Threading.Timer_timer=null;//这个要使用个全局变量,代码不好看privatevoidStartMyWork(){_timer=newTimer(MyMethod,null,0,100);}privatevoidMyMethod(objectobj){/*DoSomething*///如果在timer里面需要更新UI控件的话,由于这个timer不是在主线程中执行的因此要这样访问:this.Dispatcher.BeginInvoke(newAction(()=>{//这样更新UI}));}二、使用死循环privatevoidStartMyWork(){ActionloopAction=MyMethod;loopAction.BeginInvoke(null,null);}privatevoidMyMethod(){while(true){//DoSomethingThread.Sleep(100);}}
解决方案十一:
没用过,不过这几天玩线程,是否可以在定时器中直接就启动线程去处理?http://blog.csdn.net/xianfajushi/article/details/7609849