当前位置: 首页 > news >正文

汽车租赁网站建设内容解决方案企业网站

汽车租赁网站建设内容,解决方案企业网站,遵义本地网站,桂林生活网app下载.NET中至少有6种定时器#xff0c;每一种定时器都有它的用途和特点。根据定时器的应用场景#xff0c;可以分为UI相关的定时器和UI无关的定时器。本文将简单介绍这6种定时器的基本用法和特点。 UI定时器 .NET中的UI定时器主要是WinForm、WPF以及WebForm中的定时器。分别为每一种定时器都有它的用途和特点。根据定时器的应用场景可以分为UI相关的定时器和UI无关的定时器。本文将简单介绍这6种定时器的基本用法和特点。 UI定时器 .NET中的UI定时器主要是WinForm、WPF以及WebForm中的定时器。分别为 System.Windows.Forms.Timer System.Windows.Threading.DispatcherTimer System.Web.UI.Timer 通常情况下WinForm、WPF中的定时器是在UI线程上执行回调函数因此可以直接访问UI元素。由于WinForm、WPF支持单线程单元模型Single-Thread ApartmentSTA定时器间隔事件是在UI线程上触发因此不用担心线程安全问题。System.Web.UI.Timer是通过Javascript定时器和服务端异步回调实现也是单线程的。 请注意这里说的是通常情况后边介绍System.Windows.Threading.DispatcherTimer时会提到在非UI线程创建DispatcherTimer时也无法直接访问UI元素。 System.Windows.Forms.Timer System.Windows.Forms.Timer针对WinForm应用进行了优化是只能在WinForm上使用的定时器。这个定时器是针对单线程环境设计的是在UI线程上处理定时任务。它要求用户代码有可用的UI消息泵定时任务须在UI线程上运行或者跨线程通过Invoke或者BeginInvoke封送(marshal)到UI线程上运行。其优点是使用简单只需通过给Interval属性赋值来设置时间间隔并注册Tick事件处理定时任务。其缺点是精度不高精度为55毫秒也就是Interval赋值小于55时也是55毫秒触发一次定时任务。 public partial class TimerFrom : Form {private System.Windows.Forms.Timer digitalClock;private void TimerFrom_Load(object sender, EventArgs e){digitalClock new System.Windows.Forms.Timer();//创建定时器 digitalClock.Tick new EventHandler(HandleTime);//注册定时任务事件 digitalClock.Interval 1000;//设置时间间隔digitalClock.Enabled true;digitalClock.Start(); //开启定时器}public void HandleTime(Object myObject, EventArgs myEventArgs){labelClock.Text DateTime.Now.ToString(yyyy-MM-dd HH:mm:ss);}private void frmTimerDemo_FormClosed(object sender, FormClosedEventArgs e){digitalClock.Stop();//停止定时器digitalClock.Dispose();} } System.Windows.Threading.DispatcherTimer System.Windows.Threading.DispatcherTimer是WPF中的定时器它是基于Dispatcher对象的(并不是基于UI线程的)。DispatcherTimer的定时任务是像其他操作一样放在Dispatcher队列上其执行操作时间依赖于队列中其他任务及其优先级因此DispatcherTimer不保证在时间间隔发生时准确执行只保证不会在时间间隔发生前执行。 Dispatcher为特定线程维护工作项操作的优先级队列在线程上创建Dispatcher对象时它成为唯一可以关联该线程的Dispatcher对象WPF中DispatcherObject只能被与之关联的Dispatcher对象访问也就是非UI线程中无法直接访问UI元素WPF中的UI元素都是派生自DispatcherObject 此外DispatcherTimer不像System.Windows.Forms.Timer那样只在UI线程上创建才能触发Tick事件它在非UI线程下创建也可以触发Tick事件此时访问UI元素也需要通过Invoke或者BeginInvoke封送(marshal)到UI线程上运行。其优点也是简单易用适合在UI线程上执行任务或触发事件缺点是精度不准确可能存在延迟。 private void Dt_Tick(object sender, EventArgs e) {Dispatcher.BeginInvoke((Action)delegate (){text1.Text DateTime.Now.ToString();});Console.WriteLine(DateTime.Now.ToString()); }private void Button_Click(object sender, RoutedEventArgs e) {Task.Run(() {DispatcherTimer dt new DispatcherTimer();dt.Tick Dt_Tick;dt.Interval TimeSpan.FromSeconds(1);dt.Start();Dispatcher.Run();}); } 上述代码中DispatcherTimer是非UI线程中创建定时任务中访问UI元素text1需要通过Invoke或者BeginInvoke封送(marshal)到UI线程上运行而Console.WriteLine则可以直接运行。 System.Web.UI.Timer System.Web.UI.Timer是仅适用于.NET Framework的ASP.NET组件。通过Javascript定时器和服务端异步回调实现。每次触发定时器时只能执行一个异步回调方法而其他的异步回调方法需要等待前一个异步回调方法执行完毕后才能执行。这样可以保证在任意时刻只有一个异步回调方法在执行避免了多线程并发执行的问题。 UI无关定时器 从 .NET 6开始UI无关定时器有三个 System.Threading.Timer System.Timers.Timer System.Threading.PeriodicTimer.NET 6 System.Threading.Timer System.Threading.Timer是最基础轻量的定时器它将定期在线程池线程上执行单个回调方法。在创建定时器对象时必须指定回调方法并且后续不能修改同时也可以指定定时器回调开始执行的时间以及时间间隔。定时器创建后可以通过Change方法修改回调开始执行的时间以及时间间隔。该定时器的优点是轻量精度相对较高与Windows操作系统时钟精度一致大约15毫秒。但因为是基于线程池的所以在任务执行时间较长或者线程池过载时会出现延迟。其缺点是使用不太方便定时器创建后无法修改回调方法。 var stateTimer new var autoEvent new AutoResetEvent(false); Timer(CheckStatus, autoEvent, 1000,250);private int invokeCount0;public void CheckStatus(Object stateInfo) {AutoResetEvent autoEvent (AutoResetEvent)stateInfo;Console.WriteLine({0} Checking status {1,2}.,DateTime.Now.ToString(h:mm:ss.fff),(invokeCount).ToString());if(invokeCount 10){invokeCount 0;autoEvent.Set();} } System.Timers.Timer System.Timers.Timer在内部使用System.Threading.Timer并公开了更多的属性如AutoReset, Enabled或SynchronizingObject这些属性允许配置回调的执行方式。此外Tick事件允许注册多个处理程序。因此一个定时器可以触发多个处理程序。还可以在计时器启动后更改处理程序。与System.Threading.Timer相似其优点也是精度相对较高与Windows操作系统时钟精度一致大约15毫秒。因为默认或者SynchronizingObjectnull时是基于线程池的所以在任务执行时间较长或者线程池过载时会出现延迟。但使用要更简便一些。 public partial class TimerFrom : Form {private System.Timers.Timer timer;private void TimerFrom_Load(object sender, EventArgs e){// 支持注册多个处理程序timer.Elapsed (sender, e) { label1.Text DateTime.Now.ToLongTimeString(); };timer.Elapsed (sender, e) { Console.WriteLine(DateTime.Now.ToLongTimeString()); };//自定义回调执行的方式指定对象所在的线程SynchronizingObjectnull时在线程池上执行timer.SynchronizingObject this;timer.AutoReset true;timer.Start();} } 本例中将SynchronizingObject属性设置为Form对象因此Elapsed的处理程序在UI线程上执行可以直接修改label1.Text如果SynchronizingObject属性为null处理程序则是在线程池线程上执行修改label1.Text时需要通过Invoke或者BeginInvoke封送(marshal)到UI线程上运行。 System.Threading.PeriodicTimer System.Threading.PeriodicTimer是 .NET 6中引入的定时器。它能方便地使用异步方式它没有Tick事件而是提供WaitForNextTickAsync方法处理定时任务。通常是使用While循环结合CancellationToken一起使用。和CancellationToken一起用的时候需要注意如果CancellationToken被取消的时候会抛出一个OperationCanceledException需要考虑自己处理异常。相比之前的定时器来说有下面几个特点[1] 没有callback 来绑定事件; 不会发生重入只允许有一个消费者不允许同一个PeriodicTimer在不同的地方同时WaitForNextTickAsync不需要自己做排他锁来实现不能重入 异步化。之前的 timer 的 callback 都是同步的使用新 timer 可以使用异步方法避免了编写 Sync over Async 代码 Dispose 之后实例就无法使用并且 WaitForNextTickAsync 始终返回 false。 var cts new CancellationTokenSource(TimeSpan.FromSeconds(15)); using (var timer new PeriodicTimer(TimeSpan.FromSeconds(1))) {try{while (await timer.WaitForNextTickAsync(cts.Token)){await Task.Delay(3000);Console.WriteLine($ThreadId is {Thread.CurrentThread.ManagedThreadId} --- Time is {DateTime.Now:HH:mm:ss});}}catch (OperationCanceledException){Console.WriteLine(Operation cancelled);} } 小结 我们在开发过程中遇到的坑往往不是技术本身的坑而是我们滥用没有掌握的技术导致的在有多种技术方案可选的时候通常只关注技术的优点忽略了技术适用场景及其局限性。.NET中几种定时器各自都有其适用场景和不足但都不支持高精度计时。了解这些有助于我们在开发过程中选择合适定时器避免遇到问题后被动地替换解决方案。 文章转载自czwy 原文链接https://www.cnblogs.com/czwy/p/17862702.html
http://wiki.neutronadmin.com/news/188369/

相关文章:

  • 外包兼职做图的网站旅游网官网
  • 网站建设实训的心得的体会wordpress 用户信息
  • 做网站的主要收入公司建设网站算入什么会计科目
  • 公司网站建设怎么计费泉州专业网站建设公司哪家好
  • 做网站珠海创业商机网农村
  • 如何查看网站开发源码网站中客户的权限设置
  • 哈尔滨云建站模板河北省建设厅报名网站
  • 新乡网站建设设计快速做网站哪家好
  • 兴义市住房和城乡建设网站月销售wordpress 首页静态化
  • 检察内网门户网站建设泉州 网站制作
  • 一学一做教育视频网站有哪些内容自己做网站需要下载什么软件
  • 什么网站可以做告白的网页网站标题关键词堆砌
  • wordpress mould郑州网站优化推广培训
  • 小程序启动失败天津seo霸屏
  • 网站开发页面适应高度深圳品牌折扣店
  • 公司注销 网站备案做红包图片的网站
  • 网站开发投入产出分析网址大全2345一下
  • 云霄城乡建设局网站网络推广服务商排名
  • 怎么看网站空间wordpress忘记管理员
  • 网站建设客户沟通广州网站建设藤虎网络
  • 机械加工分类网站建设 seo结构
  • 做的比较好的官方网站WordPress 08影院源码
  • 做一个网站一般需要多少钱全国目前最火的加盟店
  • 网站目录怎么做301跳转怎么找客户渠道
  • 网站开发的前后端是哪些微信app下载安装到手机上
  • 通辽市城乡建设局网站菜鸟教程网站建设
  • 网站性能优化方法域名与ip地址的关系
  • 江苏做网站的公司有哪些做临床研究在哪个网站注册
  • 国外网站 dns网站聚合优化
  • anydrag建站专家网站建设系统wordpress搭建网盘