BeginInvoke/EndInvoke パターンを使用して非同期メソッドの実装を記述する場合、コードは次のようになります (これがキャッシュの非同期ラッパーであると推測しなくても済むようにするためです)。
IAsyncResult BeginPut(string key, object value)
{
Action<string, object> put = this.cache.Put;
return put.BeginInvoke(key, value, null, null);
}
void EndPut(IAsyncResult asyncResult)
{
var put = (Action<string, object>)((AsyncResult)asyncResult).AsyncDelegate;
put.EndInvoke(asyncResult);
}
デリゲートの型がわかっているため、キャストできるため、これは完全にうまく機能します。Put
ただし、メソッドが void を返しますが、呼び出しを終了するには、メソッドを強く型付けされたデリゲートにキャストする必要があるように見えるため、2 つのメソッドがあると面倒になり始めます。
IAsyncResult BeginPut(string key, object value)
{
Action<string, object> put = this.cache.Put;
return put.BeginInvoke(key, value, null, null);
}
IAsyncResult BeginPut(string region, string key, object value)
{
Action<string, string, object> put = this.cache.Put;
return put.BeginInvoke(region, key, value, null, null);
}
void EndPut(IAsyncResult asyncResult)
{
var put = ((AsyncResult)asyncResult).AsyncDelegate;
var put1 = put as Action<string, object>;
if (put1 != null)
{
put1.EndInvoke(asyncResult);
return;
}
var put2 = put as Action<string, string, object>;
if (put2 != null)
{
put2.EndInvoke(asyncResult);
return;
}
throw new ArgumentException("Invalid async result", "asyncResult");
}
デリゲートについて気にするのは戻り値の型 (この場合は void) だけであり、提供された引数ではないため、これを行うためのよりクリーンな方法があることを願っています。しかし、私は頭を悩ませ、オフィスの他の人に尋ねましたが、誰も答えを思いつくことができません.
1 つの解決策が custom を作成することであることはわかっていますが、これIAsyncResult
は の遅延インスタンス化などの潜在的なスレッド化の問題を伴う非常に難しい作業であり、WaitHandle
そのルートをたどるよりも、この少しハックなコードを使用したいと考えています。
is
チェックのカスケード セットなしで呼び出しを終了する方法についてのアイデアはありますか?