Windows Phone 7.1应用程序退出而不会抛出任何异常

时间:2012-05-31 10:37:55

标签: datacontext async-ctp windows-phone-7.1.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,但效果相同。我知道有很多类似的问题被提出many times before,但我还是找不到解决问题的方法。有没有办法/程序我能找到引起异常的确切方法(原因,loc)?是否可以创建多少个线程? DataContext可以这种方式安全使用吗?

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

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

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

async方法应始终返回TaskTask<TResult>,除非他们 返回void(例如,async事件处理程序)。

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

答案 1 :(得分:0)

谢谢Stephen对你的回复。我仍然无法对你提议的更改发现任何异常,但是,你的回答帮助我更好地理解幕后发生的事情。再次感谢你。

我终于设法摆脱导致应用程序的所有“无声”异常 - 几乎一半的时间 - 在开始后不久随机退出。令我惊讶的是,它可能不是由我的任何代码引起的,但可能源自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,所以我不介意我的可能开销。特定用例。