Windows Phone 7.1 应用程序退出且不引发任何异常



目前正在处理多线程WP 7.1.1应用程序,并且应用程序在"初始阶段"退出的时间略多于一半,而不会引发任何异常。它只是以所有线程返回0x0结束,并且不输入任何关闭/退出/退出事件。

...
The thread '<No Name>' (0xfde00d2) has exited with code 0 (0x0).
The thread '<No Name>' (0xe860116) has exited with code 0 (0x0).
The thread '<No Name>' (0xfdf00c6) has exited with code 0 (0x0).
The thread '<No Name>' (0xf8d012e) has exited with code 0 (0x0).
The thread '<No Name>' (0xfd5010e) has exited with code 0 (0x0).
The thread '<No Name>' (0xfbc011a) has exited with code 0 (0x0).
The thread '<No Name>' (0xf9900ee) has exited with code 0 (0x0).
The program '[268042506] UI Task: Managed' has exited with code 0 (0x0).
EOL 

"初始阶段"到底是什么意思?我使用"Windows Phone 性能分析"分析了该应用程序,并结合一些调试消息和一些日志记录,我估计它在启动后大约 3-4 秒。在他这一点上,GUI已经在很短的时间内可见。

我几乎可以肯定,问题发生在以下调用中:

private static List<MyEntries> EntriesLoad()
{
    using(var context = Context.ReadOnly) // <- works
    {
        return context.MyEntries.Where(m => !m.Deleted).OrderBy(m => m.Name).ToList(); // <- problem
    }
}
private async void EntriesReload()
{
    EntriesLoaded = false; // <- called
    var entries = await TaskEx.Run<List<MyEntries>>(EntriesLoad); // <- called
    EntriesLoaded = true; // <- only get's called 50% of the time/ otherwise app quits
}

为了防止数据上下文出现任何多线程问题,每次调用都会创建一个新上下文:

public static Context ReadOnly 
{
    get { return new Context(ConnectionReadOnly); }
}

我甚至尝试了BackgroundWorker 和 ThreadPool 而不是 Async CTP 3,但效果相同。我知道以前已经问过很多次非常相似的问题,但我根本找不到任何解决方案来解决我的问题。有什么方法/程序可以找到导致异常的确切方法(原因,位置)吗?可以创建多少线程是否有任何限制?数据上下文可以以这种方式安全地使用吗?

非常感谢

您的帮助。

async void 方法引发异常时,该异常将直接传递到"上下文" - 在本例中为 UI 上下文。

所以 - 即使您在try/catch中调用EntriesReload - 您也永远不会发现EntriesReload引发的任何异常。

async方法应该总是返回TaskTask<TResult>,除非它们必须返回void(例如,async事件处理程序)。

然后,当您调用EntriesReload 时,await结果。这不会修复崩溃,但会让您看到异常。

谢谢斯蒂芬的回复。我仍然无法对您提出的更改有任何例外,但是,您的回答帮助我更好地了解幕后发生的事情。所以再次感谢。

我终于设法摆脱了所有导致应用程序(几乎一半的时间)在启动后不久随机退出的"静默"异常。令我惊讶的是,它可能不是由我的任何代码引起的,而是可能起源于 DataContext 类。 怎么来了?在我的应用程序中,我一直在使用两个不同的连接字符串:

/* with DeferredLoadingEnabled = false; ObjectTrackingEnabled = true; */
private const string Connection = "Data Source=isostore:/MyDatabase.sdf;max buffer size=1024;max database size=512;";
/* with DeferredLoadingEnabled = false; ObjectTrackingEnabled = false; */
private const string ConnectionReadOnly = Connection + "File Mode = read only;";

这些异常仅在使用只读连接字符串的 DataContext 读取操作期间(而不是在分配返回值之后、之前或期间)发生。摆脱 ReadOnly 属性,并且不更改任何其他代码行,完全解决了我的问题。因此,也许在数据上下文或其中一个库中存在线程问题?我无法真正判断放弃 ReadOnly 连接对性能的影响,但由于我只检索少量数据,并且我以非常原子的方式使用 DataContext,因此我不介意在我的特定用例中可能存在开销。

最新更新