快速問題:我的winform應用程序(c#)中的一個窗體對WCF服務進行異步調用以獲取一些數據。如果表單在回調發生之前恰好關閉,它會崩潰並出現有關訪問處置對象的錯誤。檢查/處理這種情況的正確方法是什麼?該錯誤發生在對該方法進行Invoke調用以更新我的表單,但我無法深入到內部異常,因爲它說代碼已被優化。C#處置異步回調
驗證碼:
public void RequestUserPhoto(int userID) { WCF.Service.BeginGetUserPhoto(userID, new AsyncCallback(GetUserPhotoCB), userID); }public void GetUserPhotoCB(IAsyncResult result) { var photo = WCF.Service.EndGetUserPhoto(result); int userID = (int)result.AsyncState; UpdateUserPhoto(userID, photo); } public delegate void UpdateUserPhotoDelegate(int userID, Binary photo); public void UpdateUserPhoto(int userID, Binary photo) { if (InvokeRequired) { var d = new UpdateUserPhotoDelegate(UpdateUserPhoto); Invoke(d, new object[] { userID, photo }); } else { if (photo != null) { var ms = new MemoryStream(photo.ToArray()); var bmp = new System.Drawing.Bitmap(ms); if (userID == theForm.AuthUserID) { pbMyPhoto.BackgroundImage = bmp; } else { pbPhoto.BackgroundImage = bmp; } } } }
UPDATE:
我還是不知道哪裏去了這一點。這裏我真正需要的是一個設計模式,用於通過win窗體創建WCF異步服務調用,該窗體在異步調用返回之前可以處理優雅的窗體關閉。用戶可以隨時單擊表單上的X或任何形式的X.這個問題比上面顯示的單個例子要大得多。我的應用程序實際上會生成數百個WCF調用,並且我試圖找出如何在整個應用程序中以優雅的方式處理這些調用。例如,如果我必須爲每個WCF調用添加100行代碼與ManualResetEvents或後臺工作人員,或互斥體,或其他任何,只是這樣它不會炸燬我的應用程序,這將導致大量的錯誤空間。我需要的是一種乾淨的方式來異步調用服務,然後在表單發生關閉時將其轉換爲單向調用。換句話說,讓服務完成運行,但我不在乎結果是什麼,也不要叫回調,因爲它不再存在。
請向我們顯示您的代碼。 – SLaks 2010-06-14 19:58:04
查看更新的代碼。調用調用時發生崩潰(表示代碼已優化,不會提供任何詳細信息) – 2010-06-14 20:02:32
是否沒有辦法跟蹤ASYNC調用並在form_closing事件中顯式取消它?或者,如果線程永遠不會返回,線程會永久停留在內存中? – 2010-07-02 12:59:22