Parallel.ForEach我的 Windows 服务中有一个代码。如果ParallelOptions.MaxDegreeOfParallelism设置为 -1,我将使用大部分 CPU。但是停止服务会持续半分钟。一些应该接收服务应该停止的信号的内部控制器线程因处理器时间不足而被饿死。我将进程优先级设置为低于正常值,但这可能与此处无关。
即使所有线程都忙,如何缩短停止服务的时间?
我想暂时降低线程池中线程的优先级,因为我没有任何异步代码,但 Internet 说这是一个坏主意,所以在这里要求一种“正确”的方法。
螺纹(包括操作系统和.NET)在所有情况下之间的不同OnStart和OnStop。此外,如果停止时间很长,那么OnStop有时最终会被调用的 OS 线程是一个新线程,不会更早地显示在日志中。
要构建此代码,请创建新的 Windows 服务项目,从设计器添加 ProjectInstaller 类,将 Account 更改为 LocalService,并使用 InstallUtil 安装一次。确保 LocalService 可以写入 C:\Temp。
public partial class Service1 : ServiceBase
{
private ManualResetEvent stopEvent = new ManualResetEvent(false);
private Task mainTask;
private StreamWriter writer = File.AppendText(@"C:\Temp\Log.txt");
public Service1()
{
InitializeComponent();
writer.AutoFlush = true;
}
protected override void OnStart(string[] args)
{
Log("--------------");
Log("OnStart");
mainTask = Task.Run(new Action(Run));
}
protected override void OnStop()
{
Log("OnStop");
stopEvent.Set();
mainTask.Wait();
Log("--------------");
}
private void Log(string line)
{
writer.WriteLine(String.Format("{0:yyyy-MM-dd HH:mm:ss.fff}: [{1,2}] {2}",
DateTime.Now, Thread.CurrentThread.ManagedThreadId, line));
}
千万里不及你
函数式编程
SMILET
相关分类