1

目前正在开发一个多线程的 WP 7.1.1 应用程序,并且有一半以上的时间应用程序在“初始阶段”退出而没有抛出任何异常。它只是以所有线程返回 0x0 并且没有输入任何 Closing/Exit/Quit 事件结束。

...
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
}

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

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

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

非常感谢您的帮助。

4

2 回答 2

2

当一个async void方法抛出异常时,该异常会直接传递到“上下文”——在本例中,是一个 UI 上下文。

所以——即使你EntriesReloadtry/中调用catch——你也永远不会捕捉到任何由EntriesReload.

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

然后当你打电话时EntriesReloadawait结果。这不会修复崩溃,但它会让您看到异常。

于 2012-05-31T11:09:23.313 回答
0

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

我终于设法摆脱了所有导致应用程序 - 几乎一半时间 - 在启动后不久随机退出的“静默”异常。令我惊讶的是,它可能不是由我的任何代码引起的,但可能起源于 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;";

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

于 2012-06-07T14:41:56.233 回答