C# async callback on disposed form
- by Rodney Burton
Quick question: One of my forms in my winform app (c#) makes an async call to a WCF service to get some data. If the form happens to close before the callback happens, it crashes with an error about accessing a disposed object. What's the correct way to check/handle this situation? The error happens on the Invoke call to the method to update my form, but I can't drill down to the inner exception because it says the code has been optimized.
The Code:
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;
}
}
}
}