C# Windows Mobile应用程序意外退出
我有一个相当复杂的c应用程序,运行在WindowsMobile 5.0及更高版本上。它包括使用SQL CE、在单独线程上更新GPS坐标的代码,以及在单独线程中使用Microsoft Sync Framework在后台同步到服务器的代码。应用程序通常运行得相当好,但在生产过程中,应用程序主窗口经常会消失。 我在Program.cs文件中有如下代码:C# Windows Mobile应用程序意外退出,c#,multithreading,windows-mobile,microsoft-sync-framework,C#,Multithreading,Windows Mobile,Microsoft Sync Framework,我有一个相当复杂的c应用程序,运行在WindowsMobile 5.0及更高版本上。它包括使用SQL CE、在单独线程上更新GPS坐标的代码,以及在单独线程中使用Microsoft Sync Framework在后台同步到服务器的代码。应用程序通常运行得相当好,但在生产过程中,应用程序主窗口经常会消失。 我在Program.cs文件中有如下代码: static class Program { private static NLog.Logger _logger = NLog.LogMan
static class Program
{
private static NLog.Logger _logger = NLog.LogManager.GetLogger("Program");
[MTAThread]
static void Main()
{
try
{
_logger.Info("Program V {0} starting.", Utility.AppVersion);
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
Application.Run(new MainForm());
_logger.Info("After Application.Run().");
}
catch (Exception ex)
{
_logger.ErrorException("Exception occurred.", ex);
}
}
static void MobileDevice_Hibernate(object sender, EventArgs e)
{
_logger.Info("Hibernate was received.");
}
static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
_logger.ErrorException("Unhandled exception was thrown", e.ExceptionObject as Exception);
}
}
我按预期看到启动信息日志,当应用程序消失时,我还会收到After application.Run消息。但是我没有在MainForm.Closing事件中记录消息,因此似乎从未调用它。我也没有从Application.Run的异常处理程序或未处理的异常处理程序中记录任何异常。我认为这可能与运行内存不足有关,这就是为什么我也连接了Hibernate事件。但是我也没有得到Hibernate事件
如果您有任何帮助或建议,我将不胜感激,因为我没有想法和要检查的内容。好吧,尽管有可能会说一句显而易见的话,有什么东西正在破坏您的应用程序,阻止您的关闭事件启动 对于在不同线程上运行的项目,您可以为它们创建实现IDisposable的类容器吗?然后,您可以在Dispose方法中放置NLog引用来记录数据
public class FirstClass : IDisposable {
private bool isDisposed;
public FirstClass() {
isDisposed = false;
}
public void Dispose() {
_logger.Info("FirstClass is done.");
isDisposed = true;
}
public void Method1() {
while (!isDisposed) {
// your code here
}
}
}
但是,您需要创建一种方法,以便该类可以访问_logger
线程中的bug可能很难捕捉。好吧,冒着显而易见的风险,有什么东西正在破坏你的应用程序,阻止你的关闭事件触发 对于在不同线程上运行的项目,您可以为它们创建实现IDisposable的类容器吗?然后,您可以在Dispose方法中放置NLog引用来记录数据
public class FirstClass : IDisposable {
private bool isDisposed;
public FirstClass() {
isDisposed = false;
}
public void Dispose() {
_logger.Info("FirstClass is done.");
isDisposed = true;
}
public void Method1() {
while (!isDisposed) {
// your code here
}
}
}
但是,您需要创建一种方法,以便该类可以访问_logger
线程中的bug可能很难捕捉。您好,jp2code,我不确定是否遵循您的建议。无论如何,独立线程上的所有主函数都有try/catch块,我没有从那里得到任何记录。此外,异常是否会马歇尔到主线程,然后在那里或“UnhandledException处理程序”中被捕获?嘿,DJ。我添加了一个创建一次性类的小代码示例。在本例中,Method1是您用来执行线程的任何方法。当它完成并且您的类被销毁时,您的_logger函数将被调用。嗨,jp2code,我不确定我是否遵循您的建议。无论如何,独立线程上的所有主函数都有try/catch块,我没有从那里得到任何记录。此外,异常是否会马歇尔到主线程,然后在那里或“UnhandledException处理程序”中被捕获?嘿,DJ。我添加了一个创建一次性类的小代码示例。在本例中,Method1是您用来执行线程的任何方法。当它完成并且类被销毁时,将调用_logger函数。