加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 应用程序关闭时的任务处理

发布时间:2020-12-15 07:46:27 所属栏目:百科 来源:网络整理
导读:我有一个.Net(v4.0) Windows服务应用程序,它在开始时旋转tpl任务,执行某些长时间运行的活动,并且基本上在应用程序的生命周期内保持活动状态,因此使用TaskCreationOptions.LongRunning参数值创建. 每当服务停止并且.OnStop()方法被调用时,我.Cancel()我在创建
我有一个.Net(v4.0) Windows服务应用程序,它在开始时旋转tpl任务,执行某些长时间运行的活动,并且基本上在应用程序的生命周期内保持活动状态,因此使用TaskCreationOptions.LongRunning参数值创建.

每当服务停止并且.OnStop()方法被调用时,我.Cancel()我在创建它时移交给工作任务的CancellationToken(Source)我想要它.OnlyOnCanceled(…)继续任务到跑.

问题是,服务/流程关闭而没有继续任务“完全”运行 – 有时它会相当快地退出,有时它会完全运行,有时则不会.

这对我来说是有意义的,因为该特定任务可能位于另一个线程而不是主线程上,因此无法“阻止”/阻止主要任务结束.

因为我在那个Windows服务应用程序中没有SynchronizationContext,所以我无法告诉延续任务在主线程上运行/所以我想知道:我该怎么做?

更准确地说,运行tpl任务处理应用程序关闭的最佳实践是什么?

解决方法

你必须等待你的任务在OnStop方法(或OnPause和OnShutdown)中完成.

你有大约20秒的时间在OnStop上做你需要的任何事情.如果您认为您的线程不会在20秒内完成,则应调用RequestAdditionalTime.一旦从OnStop返回,您的服务流程就可以终止.

无论是传递ExecuteSynchron还是使用SynchronizationContext,使用ContinueWith都将异步调用传递给它的委托.一旦ContinueWith执行,假设它是OnStop的最后一行,OnStop返回并将控制权返回给SCN(好吧,ServiceBase,但是它将服务的状态设置为STOPPED并将控制返回到SCM以推断终止您的进程.

ExecuteSynchronously意味着continuation与其继续执行的任务同步运行.即在与任务相同的线程上运行(如果可能).该任务可能没有在调用ContinueWith的线程上运行(否则它无法调用ContinueWith),因此ExecuteSynchronusly并不意味着与ContinueWith的调用同步.

你需要做一些事情:

RequestAdditionalTime(TimeSpan.FromSeconds(30).Milliseconds);
cancellationToken.Cancel();
task.Wait();

在OnStop中,等待意味着在任务完成之前您不会退出OnStop(或者它需要超过30秒并且您的进程终止)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读