2012-12-08 6 views
9

マイOperationContract:サービス参照の構成ではVisual Studioで生成された非同期WCF呼び出しの使用方法?

public List<MessageDTO> GetMessages() 
     { 
      List<MessageDTO> messages = new List<MessageDTO>(); 
      foreach (Message m in _context.Messages.ToList()) 
      { 
       messages.Add(new MessageDTO() 
       { 
        MessageID = m.MessageID, 
        Content = m.Content, 
        Date = m.Date, 
        HasAttachments = m.HasAttachments, 
        MailingListID = (int)m.MailingListID, 
        SenderID = (int)m.SenderID, 
        Subject = m.Subject 
       }); 
      } 
      return messages; 
     } 

私はオプション「非同期操作を生成する」にチェック。生成されたGetMessagesAsync()はどのように使用しますか?ネットでは、AsyncCallbackを使用した例が見つかりましたが、私はそれに精通していません。 .NET 4.5のasyncawaitキーワードのような使いやすい方法で使用する方法はありますか?そうでない場合は、メソッドを非同期に呼び出すために何をすべきですか?

答えて

6

をコールバック。

新しいasync/await構文を使用する場合は、[タスクベースの操作を生成する](デフォルトで選択されています)を選択する必要があります。あなたが見ることができるように、これ以上のコールバックがない

public System.Threading.Tasks.Task<string> GetDataAsync(int value) { 
     return base.Channel.GetDataAsync(value); 
    } 

デフォルトのWCFテンプレートを使用して、これは次のプロキシコードを生成します。代わりに Task<T>が返されます。

あなたは次のようにこのプロキシを使用することができます。

public static async Task Foo() 
{ 
    using (ServiceReference1.Service1Client client = new ServiceReference1.Service1Client()) 
    { 
     Task<string> t = client.GetDataAsync(1); 
     string result = await t; 
    } 
} 

あなたはasyncで呼び出しメソッドをマークして、あなたのサービスメソッドを呼び出すときawaitを使用する必要があります。

+0

.NET V4.5以上を使用している場合は、[タスクベースの操作の生成]オプションが有効になります。 –

+0

@ManasKumarあなたはそれを別の質問として投稿できますか?そうすれば人々はそれに答えることができます。 –

0

どのようにこのような何か...

public async Task<string> DoSomething() 
{ 
var someProxy = new ServiceClient(); 

var t = someProxy.SomeMethodAsync(); 
await Task.WhenAny(t); 

return t.Result; 

}について

3

(あなたは純4.5を使用している場合)あなたのサービス参照がタスクベースの非同期呼び出しを生成するように設定することができます。 (サービスリファレンスの設定>非同期操作の生成を許可する>タスクベース操作の生成を選択をチェックしてください)これらはいずれもasyncメソッドのように使用できます。ここではそれを使用する方法の例です:

using (var proxy = new YourServiceClient()) 
{ 
    var t1 = proxy.GetMessagesAsync(); 
    var t2 = proxy.GetMessagesAsync(); 
    //they're runnning asynchronously now! 

    //let's wait for the results: 
    Task.WaitAll(t1, t2); 
    var result1 = t1.Result; 
    var result2 = t2.Result; 
    Console.WriteLine(result1); 
    Console.WriteLine(result2); 
} 

あなたのクライアントは、純4.5を使用していない場合、あなたはasyncを使用するサービス参照を生成することはできません。コールバックを使用して、古い方法で行う必要があります。ここでは一例です。これらのシナリオのいずれかの実際のコードでは、あなたが決算の混乱世界に始めるためにAvoiding Problems with the Using Statementthis codeを参照して、クライアントをクリーンアップするためにusingまたはIDisposable.Dispose()を使用してはならないこと

static void m() 
{ 
    var proxy = new YourServiceClient(); 
    proxy.GetMessagesCompleted += proxy_GetMessagesCompleted; 
    proxy.GetMessagesAsync(); 
} 

static void proxy_GetMessagesCompleted(object sender, GetMessagesCompletedEventArgs e) 
{ 
    var proxy = (IDisposable)sender; 
    proxy.Dispose(); //actual code to close properly is more complex 

    if (e.Error != null) 
    { 
     // do something about this 
    } 

    var result = e.Result; 
    Console.WriteLine(result); 
} 

注意これらの事。

1

あなたはVS2012にしている場合は、あなたがこのような*Async呼び出し使用することができます:あなたは「asynchrounous操作を生成する」を選択した場合、あなたが使用する必要があり「古い」動作を取得します

var proxy = new MyClient(); 
var result = await proxy.GetMessagesAsync(); 
関連する問題