Is this a clean way to manage AsyncResults with Generic Methods?
- by Michael Stum
I've contributed Async Support to a Project I'm using, but I made a bug which I'm trying to fix. Basically I have this construct:
private readonly Dictionary<WaitHandle, object> genericCallbacks
     = new Dictionary<WaitHandle, object>();
public IAsyncResult BeginExecute<T>(RestRequest request, AsyncCallback callback,
    object state) where T : new()
{
    var genericCallback = new RequestExecuteCaller<T>(this.Execute<T>);
    var asyncResult = genericCallback.BeginInvoke(request, callback, state);
    genericCallbacks[asyncResult.AsyncWaitHandle] = genericCallback;
    return asyncResult;
}
public RestResponse<T> EndExecute<T>(IAsyncResult asyncResult) where T : new()
{
    var cb = genericCallbacks[asyncResult.AsyncWaitHandle]
        as RequestExecuteCaller<T>;
    genericCallbacks.Remove(asyncResult.AsyncWaitHandle);
    return cb.EndInvoke(asyncResult);
}
So I have a generic BeginExecute/EndExecute method pair. As I need to store the delegate that is called on EndExecute somewhere I created a dictionary.
I'm unsure about using WaitHandles as keys though, but that seems to be the only safe choice. Does this approach make sense? Are WaitHandles unique or could I have two equal ones?
Or should I instead use the State (and wrap any user provided state into my own State value)?
Just to add, the class itself is non-generic, only the Begin/EndExecute methods are generic.