3

次のシナリオがあります:
コマンドが入力されると (テスト用にはコンソール アプリケーションで、準備ができたら WebService になることを願っています)、いくつかのコードを実行し、さらにユーザー入力が必要になったらコマンドに戻ります。すぐに通訳。新しい入力が与えられたら、処理を中断したところから再開したい。これは c#5 の async-await パターンによく似ているので、試してみることにしました。私はこれについて考えていました:

public void CommandParser()
{
   while(true)
   { 
      string s = Console.ReadLine();
      if (s == "do_something")
         Execute();
      else if (s == "give_parameters")
         SetParameters();
      //... 
   }
}
MySettings input;
public async void Execute()
{
  //do stuff here
  MyResult result = null
  if (/*input needed*/){
     input = new MySetting();
     result = await input.Calculate();
  }
  else { /* fill result synchronously*/}
  //do something with result here

}

public void SetParameters()
{
   if (input!=null)
      input.UseThis("something"); //now it can return from await
}

私の質問は、MySettings.Calculate と MySettings.UseThis の書き方です。最初からタスクを返す方法と、2番目から準備完了を通知する方法は? Task の多くのファクトリ メソッドを試しましたが、適切なメソッドが見つかりません。助けてください!

4

1 に答える 1

6

1 つのオプションは、 を使用することTaskCompletionSource<T>です。これによりタスクが作成され、ソースに対してSetResultorを呼び出すことができます。これにより、タスクが適切に通知されます。SetException

これは、私がEduasyncに実装するAsyncTaskMethodBuilder<T>ために使用したものです。例としてそれを見てください。

事前に をセットアップするTaskCompletionSourceか、他の調整を実行して、input.CalculateUseThisが同じオブジェクトについて認識できるようにする必要がありますが、その後Calculateは を返しcompletionSource.TaskUseThisを呼び出しますcompletionSource.SetResult

を呼び出すとSetResult、コンソール アプリ (または Web サービス) を使用している場合、非同期メソッドは別のスレッド プール スレッドで続行されることに注意してください TaskCompletionSource。いわば次のラウンドに使用します。

于 2011-05-26T21:26:22.303 に答える