1

私は、社内で長い間使用されているカスタム フレームワークを使用しています。コード内で新しい非同期機能を使用したいと考えています。

これを行うには、「MyClass」の「ProcessRequestMessage」を非同期としてマークする必要があります。インターフェイス「IFramework」とクラス「FrameworkBase」を変更できません。

フレームワークは、「ProcessRequestMessage」が非同期的に終了することを既に想定しているため、メソッドの最後で「Wait()」を使用する必要はありません。「SetResponseCode」への呼び出しは、「MyClass」のインスタンスを終了するようにフレームワークに通知します

質問: 非同期機能のドキュメントを読みましたが、無効なイベントのみを非同期ワークフローへのエントリとして非同期としてマークする必要があります (タスクはここでは適用されません)。私のコードでは、void インターフェイス メソッドの実装をエントリ ポイントとしてマークする必要があります。

だから私はこれを行うことができます:

interface IFramework
{
    void ProcessRequestMessage()

    void SetResponseCode(int code)
}

public abstract class FrameworkBase: IFramework
{
    abstract void ProcessRequestMessage()

    public void SetResponseCode(int code)
    {
        //internal implementation
    }
}

public class MyClass: FrameworkBase
{

    protected override async void ProcessRequestMessage()
    {
        //await something

        SetResponseCode(0);
    }
}
4

1 に答える 1

3

避けるべき主な理由は 2 つありますasync void

  1. 呼び出し元のコードは、メソッドが返されたときにメソッドが完了したと見なします。
  2. 例外の処理方法。

特定のケースでは、呼び出し元のコードは、返されたときに操作が完了しているとは想定していないため、使用できますが、例外には十分注意する必要があります。(私は の代わりにタスクの継続を使用することを好みます)。ProcessRequestMessageasync voidasync void

これだけのために書くことをお勧めFrameworkTaskBaseします:

public class FrameworkTestBase: FrameworkBase
{
  protected abstract Task ProcessRequestMessageAsync();
  protected override sealed void ProcessRequestMessage()
  {
    ProcessRequestMessageAsync().ContinueWith(t =>
    {
      if (t.IsFaulted || t.IsCanceled)
        SetResponseCode(-1);
      else
        SetResponseCode(0);
    });
  }
}

public class MyClass: FrameworkBase
{
  protected override async Task ProcessRequestMessageAsync()
  {
    //await something
  }
}

または ( を使用async void):

public class FrameworkTestBase: FrameworkBase
{
  protected abstract Task ProcessRequestMessageAsync();
  protected override sealed async void ProcessRequestMessage()
  {
    try
    {
      await ProcessRequestMessageAsync();
      SetResponseCode(0);
    }
    catch
    {
      SetResponseCode(-1);
    }
  }
}
于 2013-11-05T13:37:53.317 に答える