目前正在开发一个多线程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可以这种方式安全使用吗?
非常感谢您的帮助。
答案 0 :(得分:2)
当async void
方法抛出异常时,该异常会直接传递到“上下文” - 在本例中为UI上下文。
所以 - 即使您在EntriesReload
/ try
中呼叫catch
- 您也永远不会发现EntriesReload
引发的任何异常。
async
方法应始终返回Task
或Task<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,所以我不介意我的可能开销。特定用例。