gpt4 book ai didi

c# - 如何减少 Windows 服务的高 CPU 使用率?

转载 作者:太空宇宙 更新时间:2023-11-03 15:12:47 25 4
gpt4 key购买 nike

我期待解决我的 Windows 服务的特定问题。它使用了大约 25% 的 CPU,而且我认为,对于它必须完成的任务来说,这是非常诚实的方式。

windows服务包含3个线程,用作filewatcher。如果创建了特定类型的文本文件,它们会在 sql server 上启动一个存储过程,具体取决于......

3 个文件观察器,因为有 3 种文件类型,我必须观察它们。

这是我目前使用的代码:

watcher.cs:

internal class Watcher
{
private List<FileSystemWatcher> _fileWatcher;
private Regex _regex;
public bool started;

public Watcher()
{
started = false;
_fileWatcher = new List<FileSystemWatcher>();
_regex = new Regex(@"(?<=Anz_)(.*)(.txt*@)(.*)");
initAllWatcher();
}


private void initAllWatcher()
{
// LBH:
var watcher = new FileSystemWatcher();
watcher.Filter = ConfigurationManager.AppSettings["FilterLBH"];
watcher.Path = ConfigurationManager.AppSettings["FilePath"];
watcher.Created += onCreated;
_fileWatcher.Add(watcher);

// LSC:
watcher = new FileSystemWatcher();
watcher.Filter = ConfigurationManager.AppSettings["FilterLSC"];
watcher.Path = ConfigurationManager.AppSettings["FilePath"];
watcher.Created += onCreated;
_fileWatcher.Add(watcher);

// LEM:
watcher = new FileSystemWatcher();
watcher.Filter = ConfigurationManager.AppSettings["FilterLEM"];
watcher.Path = ConfigurationManager.AppSettings["FilePath"];
watcher.Created += onCreated;
_fileWatcher.Add(watcher);
}

public void Run()
{
foreach (var filewatcher in _fileWatcher)
{
filewatcher.EnableRaisingEvents = true;
}

started = true;

Thread.CurrentThread.IsBackground = true;
Thread.CurrentThread.Priority = ThreadPriority.Lowest;

while (started)
{
}
}

private async void onCreated(object Source, FileSystemEventArgs Arg)
{
await execute(Arg);
}

private async Task execute(FileSystemEventArgs Arg)
{
string tablename = _regex.Split(Arg.Name)[1];
string targetDatabase = _regex.Split(Arg.Name)[3];

if (tablename.Equals("") == false)
{
if (targetDatabase.Equals("") == false)
{
using (var dbConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["Connection"].ConnectionString))
{
var command = new SqlCommand(ConfigurationManager.AppSettings["StoredProcedure"], dbConnection);
command.CommandTimeout = dbConnection.ConnectionTimeout;
command.CommandType = CommandType.StoredProcedure;
command.Parameters.Add("@strParDbTabelle", SqlDbType.VarChar).Value = tablename;
command.Parameters.Add("@strParDbSchema", SqlDbType.VarChar).Value = "dbo";
command.Parameters.Add("@strParDbName", SqlDbType.VarChar).Value = targetDatabase;

try
{
await command.ExecuteNonQueryAsync();
}
catch (System.Exception)
{
throw;
}
}
}
}
}
}

程序.cs:

internal static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
private static void Main()
{
ServiceBase[] ServicesToRun;

ServicesToRun = new ServiceBase[]
{
new BaanJobActiService()
};

ServiceBase.Run(ServicesToRun);
}
}

由于我将这些行添加到我的代码中:

Thread.CurrentThread.IsBackground = true;
Thread.CurrentThread.Priority = ThreadPriority.Lowest;

如果其他进程需要 CPU 使用率,CPU 使用率会降至最低。这目前有帮助,但我认为这不是最终解决方案。

所以也许你们中的一个人可以教我,我可以改进什么以及为什么我必须改变它以获得更好的性能?!

那太棒了!先感谢您。 :-)

PS:我知道我初始化三个观察者的方式不是最好的方式,但我认为这不应该是重点..

PPS:我实现了异步查询的执行,因为这是非常长的运行队列,没有这个实现我遇到了超时问题..^^

最佳答案

Thread.Sleep(10) 添加到 while 循环中为我完成了这项工作。移除循环是不可能的,因为没有它文件观察器无法工作。

无论如何..这个解决方案将 CPU 使用率降低到 0 - 0.5%,与 25-30% 相比非常好!

关于c# - 如何减少 Windows 服务的高 CPU 使用率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40380412/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com