我使用SyslogNet.Client向服务器发送syslog(UDP)消息。我遍历数据库中的错误集合并发送它们。只有约40%的消息到达。据我所知,使用UDP,无法保证邮件到达,但这是一个非常高的百分比。但是,如果我在循环的每次迭代之间调用Thread.Sleep(1)
,则100%的消息到达。我无法理解为什么会发生这种情况
这是循环:
private static void SyslogErrors(Dictionary<int, string> errorCol)
{
foreach (var error in errorCol)
{
SyslogMessage("AppName", error.Value);
Thread.Sleep(1);
}
}
这里SyslogMessage
:
private static void SyslogMessage(string appName, string message)
{
using (_syslogSender = new SyslogUdpSender(Server, Port))
{
var msg = new SyslogMessage(DateTime.Now,
Facility.SecurityOrAuthorizationMessages1,
Severity.Informational,
Environment.MachineName,
appName,
message);
_syslogSender.Send(msg, new SyslogRfc3164MessageSerializer());
}
}
首先,为什么会发生这种情况?其次,&#34;最佳实践&#34;减慢循环的方法? Thread.Sleep(1)似乎不是一个非常干净的解决方案。
谢谢!
答案 0 :(得分:1)
看起来操作系统在垃圾邮件过多时会拒绝某些日志,睡眠很可能会很好。但确实有一些更可靠的解决方案。您可以设置Timer对象并拨打记录器using the Elapsed event。
类似的东西:
//likely much longer than needed, I figure you dont need this to breeze anyway
aTimer = new System.Timers.Timer(50);
aTimer.Elapsed += timeToLog;
aTimer.Enabled = true;
然后你登录时间:
private static void timeToLog(Object source, ElapsedEventArgs e)
{
var error = getNextError(); //Keep an iterator somewhere
SyslogMessage("AppName", error.Value);
}
我可以添加您需要的代码来创建和管理迭代器(getNextError),尽管我们超出了您的问题范围。