2012-05-31 19 views
1

目前工作的一個多線程的WP 7.1.1應用和略多於在「初級階段」的應用程序退出時半沒有拋出任何異常。它只是以所有線程返回0x0並且沒有輸入任何關閉/退出/退出事件結束。的Windows Phone 7.1的應用程序退出而不引發任何異常

... 
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在很短的時間內就已經可見了。

,我幾乎可以肯定,二人發生與以下調用的問題:

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

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的任何多線程問題,新的上下文對每個調用創建

我甚至嘗試過BackgroundWorker和ThreadPool,而不是Async CTP 3,但效果相同。我知道非常類似的問題已被問到many times before,但我根本找不到任何解決方案,至於我的問題。有什麼方法/程序可以找到導致異常的確切方法(原因,loc)?可以創建多少個線程有任何限制嗎? DataContext可以以這種方式安全使用嗎?

非常感謝您的幫助。

回答

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;"; 

僅在發生例外的(而不是之後,之前或同時指派返回值)閱讀所使用的只讀連接字符串DataContext的opperations。擺脫ReadOnly屬性,而不改變其他一行代碼,完全解決了我的問題。那麼在DataContext或其中一個庫中可能存在線程問題?我無法真正判斷拋棄ReadOnly連接的性能影響,但由於我只檢索少量數據,而且我以非常原子的方式使用DataContext,所以我不介意在我的可能開銷特別的用例。

2

async void方法拋出異常,該異常是直通的「上下文」傳遞 - 在這種情況下,UI上下文。

所以 - 即使你調用一個try/catchEntriesReload - 你永遠不會趕上由EntriesReload引發的任何異常。

async方法應該總是返回TaskTask<TResult>,除非他們返回void(例如,async事件處理程序)。

然後當你調用EntriesReloadawait結果。這不會修復崩潰,但它會讓你看到異常。

相關問題