当发生未处理的异常时,将在全局未处理的异常处理程序中弹出一个错误窗口,在此窗口中,有一个名为Restart的按钮,当单击此按钮时,我尝试将错误记录到远程跟踪侦听器远程服务器,并重新启动应用程序,但事实证明,当应用程序重新启动后,日志永远不会成功发送,我确保执行日志语句,但似乎日志不会发送到按钮click事件处理程序执行完成。
当我将发送日志拆分并重新启动到两个按钮时,它运行良好。
我也尝试将其中任何一个部分放在另一个线程中,但它仍然不起作用。
已经把头发拉了几天,有人可以救我吗?非常感谢...
答案 0 :(得分:0)
使用RemoteServiceTraceListener时调用Write时,LogEntry会被放入要发送到服务器的列表中。计时器经常运行并将列表中的项目发送到服务器。即使SendImmediately设置为True,也会发生这种情况。如果SendImmediately设置为True,则定时器回调将在大约1秒后触发。
因此,正在发生的事情是,当您执行重新启动时,您正在拆除应用程序,然后才能将消息发送到服务器。我曾希望这些消息存储在隔离存储中,然后在重启后发送回服务器,但这似乎不会发生。
我能够让它按照我认为你想要的方式工作,但它有点乱 - 也许有一种更简单的方法?
首先创建一个LoggingServiceFactory实例,然后设置一个回调以导航到应用程序URL。
public static class LogHelper
{
public static void Write(LogEntry logEntry)
{
// Factory is not configured so set config name
var factory = EnterpriseLibraryContainer.Current.GetInstance<LoggingServiceFactory>();
factory.EndpointConfigurationName = "CustomBinding_ILoggingService";
var proxy = factory.CreateChannel();
proxy.Write(logEntry, () =>
{
// Set callback Action
Deployment.Current.Dispatcher.BeginInvoke(() =>
{
System.Windows.Browser.HtmlPage.Window.Navigate(
new Uri("http://localhost/app.aspx"));
});
});
}
}
public static class ILoggingServiceExtension
{
public static void Write(this ILoggingService proxy, LogEntry logEntry, Action action)
{
LogEntryMessage[] messages = new LogEntryMessage[] { logEntry.ToLogEntryMessage() };
proxy.BeginAdd(messages, r =>
{
try
{
proxy.EndAdd(r);
if (action != null)
action();
}
finally
{
if (proxy != null)
{
((IDisposable)proxy).Dispose();
}
}
}, null);
}
}
然后通过LogHelper编写消息:
var logEntry = new LogEntry() { Message = "Test", Categories = { "default"} };
LogHelper.Write(logEntry);