0

APMパターンを使用して非同期メソッドを公開するクラスの周りにラッパークラスを作成するシナリオがあります。私の考えは、ラッパークラスは、TAPパターンを利用して、以下exampledなどのラッパー・メソッドを公開するべきであるということです。APMからTAPにメソッドを変換するラッパークラスの例外処理

public class ClassToBeWrapped 
{ 
    ... 
    // Throws ExceptionToBeWrapped when used incorrectly 
    public void BeginRead() 
    ... 
} 

public class WrapperClass 
{ 
    ... 
    public Task<int> ReadAsync() 
    { 
    return Task.Factory.FromAsync(classToBeWrapped.BeginRead,...); 
    } 
} 

ラッパークラスの消費者はReadAsyncメソッドを呼び出すと、私は包まれた方法のいずれかのカスタム例外をしたいです元の例外の代わりにラップされ、消費者に渡される。

public class ConsumerClass 
{ 
    ... 
    try 
    { 
    await wrappedClass.ReadAsync(...); 
    }catch (WrappedException we) 
    { 
    // Does not catch WrappedException, only ExceptionToBeWrapped 
    ... 
    } 

しかし、私はいつもcatchメソッドでラップされていない例外をキャッチしてしまいます。私はReadAsyncメソッドでこれを処理しなければならないと思っていますが、それまでは失敗しています。

これを達成するためのアドバイスはありますか?

+0

あなたは 'キャッチ(WrappedExceptionたち)' 'WrappedException'をキャッチしていないことを言っています。それの再現可能な例を投稿できますか?また、このスタートガイドが役に立つかもしれません:[APM実装のためのTAPラッパー](https://blog.stephencleary.com/2012/07/async-interop-with-iasyncresult.html) – JSteward

答えて

0

は、あなただけのawaitインナータスク、例外をキャッチすることができ、そしてラップされた例外をスローする必要があります

public async Task<int> ReadAsync() 
{ 
    try 
    { 
    return Task.Factory.FromAsync(classToBeWrapped.BeginRead,...); 
    } 
    catch (ExceptionToBeWrapped ex) 
    { 
    throw new WrappedException(ex); 
    } 
}