1

非同期CTPは非常に使いやすいです。Windows Phoneの例をいくつか見てきましたが、すべて次のものを使用しています:
(Assembly AsyncCtpLibrary_Phone.dll、v2.0.50727、AsyncCtpExtensions)。

 var client = new WebClient();
 string data = await client.DownloadStringTaskAsync(new Uri(url));

または上記のコードのようなもの。

async / awaitでメソッドを使用するにはどうすればよいですか?(WCF)
今日、すべてのメソッドは次のように機能します。

  service.MyRequestCompleted += service_myRequestCompleted;
  service.MyRequestAsync();

サービスの拡張メソッドを使用する方法が見つかりません。

4

2 に答える 2

4

残念ながら、これをイベントに一般化する良い方法を見つけられませんでしたが、特定のイベントにこれを適応させるのは簡単です:

public static Task WhenRequestCompleted(MyService service) //can make it an extension method if you want.
{
    TaskCompletionSource<object> tcs = new TaskCompletionSource<object>();

    service.MyRequestCompleted += () => //change parameter list to fit the event's delegate
        {
            tcs.SetResult(null);
        };
    service.MyRequestAsync();

    return tcs.Task;
}

次に、次のことができます。

await WhenRequestCompleted(service);
//code that runs after the request is completed.

ここにパターンが表示されていると思いますので、これを適応させて、他のタイプの他のイベントで機能するようにすることができます。

ああ、イベントに特に重要な引数がある場合は、これを a ではなく a に戻すことがTask<T>できTask、使用する代わりにtcs.SetResult(null)、ラムダのパラメーターの 1 つを使用して結果を設定できます。

于 2012-10-12T18:11:53.723 に答える
0

WP7に取り組んでからしばらく経ちました。そのため、クライアントプロキシには、コントラクトメソッドごとにEAPエンドポイント(+ )とAPMエンドポイント(+ )の両方があると想定します。*Async*CompletedBegin*End*

それが正しければ、次のように/メソッドTaskFactory.FromAsyncをラップするために使用できます。Begin*End*

[ServiceContract]
public interface ICalculator
{
  [OperationContract]
  uint Divide(uint numerator, uint denominator);
}

static class Program
{
  // Wrap those Begin/End methods into a Task-based API.
  public static Task<uint> DivideAsyncTask(this CalculatorClient client,
      uint numerator, uint denominator)
  {
    return Task<uint>.Factory.FromAsync(client.BeginDivide, client.EndDivide,
        numerator, denominator, null);
  }

  static async Task CallCalculator()
  {
    var proxy = new CalculatorClient();
    var task = proxy.DivideAsyncTask(10, 5);
    var result = await task;
    Console.WriteLine("Result: " + result);
  }

  static void Main(string[] args)
  {
    try
    {
      CallCalculator().Wait();
    }
    catch (Exception ex)
    {
      Console.Error.WriteLine(ex);
    }

    Console.ReadKey();
  }
}

今日と明日の非同期WCFに関する私のブログ投稿の1つに興味があるかもしれません。残念ながら、WP7はまだ「今日」モードのままです。非同期CTPは、VS2012がリリースされたため、間もなく廃止される可能性があります。

于 2012-10-12T20:51:15.397 に答える