【发布时间】:2011-03-03 16:43:16
【问题描述】:
快速提问:我的 winform 应用程序 (c#) 中的一个表单对 WCF 服务进行异步调用以获取一些数据。如果表单恰好在回调发生之前关闭,它会因访问已处置对象的错误而崩溃。检查/处理这种情况的正确方法是什么?该错误发生在对更新表单的方法的 Invoke 调用中,但我无法深入了解内部异常,因为它表示代码已被优化。
代码:
公共无效RequestUserPhoto(int userID) { WCF.Service.BeginGetUserPhoto(用户 ID, 新的 AsyncCallback(GetUserPhotoCB),用户 ID); } 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;
}
}
}
}
更新:
我仍然不知道该去哪里。我在这里真正需要的是一种设计模式,用于从 win 表单进行 WCF 异步服务调用,该模式在异步调用返回之前可以优雅地处理表单关闭。用户可以随时单击表单或任何表单上的 X。这个问题比我上面展示的单个例子要大得多。我的应用程序实际上进行了数百次 WCF 调用,我试图弄清楚如何优雅地处理这些,并且在整个应用程序中以一致的方式。例如,如果我必须为每个 WCF 调用添加 100 行带有 ManualResetEvents 或后台工作人员或互斥锁或其他任何东西的代码,这样它就不会轰炸我的应用程序,这将引入很大的错误空间。我需要的是一种干净的方式来异步调用服务,然后在表单关闭时将其转换为单向调用。也就是说,让服务跑完,但我不管结果是什么,也不要调用回调,因为它已经不存在了。
【问题讨论】:
-
查看更新的代码。 Invoke 调用时发生崩溃(说代码已优化,不会提供任何细节)
-
没有办法跟踪 ASYNC 调用并在 form_closure 事件中明确取消它吗?还是该线程永远卡在内存中,如果它永远不会返回?
标签: c# winforms exception-handling asynchronous callback