2017-05-05 14 views
0

A WCFの契約は次のようになります。タスクベースのWCF呼び出しをOneWayにする必要がありますか?

[ServiceContract] 
public interface IService 
{ 
    [OperationContract] 
    void DoSomethingFast(); 

    [OperationContract] 
    void DoSomethingSlow(); 

    [OperationContract] 
    int GetSomethingFast(); 

    [OperationContract] 
    int GetSomethingSlow(); 
} 

クライアントは、これらの呼び出しのいずれかを行い、そのスレッドのブロックをサーバがそのことをしながら。 Fastメソッドの場合は問題ありませんが、Slowメソッドの場合、このブロックは理想とはかけ離れています。彼らは実際には2つの方法ですので、私たちはDoSomething方法に​​を追加することができますが、我々はGetSomethingメソッドのために同じことを行うことはできません - 私たちは結果を待つを持っている

[ServiceContract] 
public interface IService 
{ 
    [OperationContract(IsOneWay = true)] 
    void DoSomethingFast(); 

    [OperationContract(IsOneWay = true)] 
    void DoSomethingSlow(); 

    [OperationContract] 
    int GetSomething(); 

    [OperationContract] 
    int GetSomethingSlow();  
} 

はTask-を入力します。ベースの非同期パターン(TAP)。私たちはTaskとWCFを返すように契約を定義しています。私の知る限りでは、魔法の舞台裏ですぐにTaskを返します。完了する前にWCFサービスからのコールバックを待ちます。これは、代わりにawaitの使用を可能にする、クライアント側のブロッキングを排除します。

[ServiceContract] 
public interface IService 
{ 
    [OperationContract(IsOneWay = true)] 
    Task DoSomethingFastAsync(); 

    [OperationContract(IsOneWay = true)] 
    Task DoSomethingSlowAsync(); 

    [OperationContract] 
    Task<int> GetSomethingAsync(); 

    [OperationContract] 
    Task<int> GetSomethingSlowAsync();  
} 

私の質問はどのようにこのすべての作品、そしてあなたはまだサービス契約上の​​を含める必要があるかどうかについてです:

  • 上記のビットは私の知る限りで正確ですですか?サービスが終了したことを通知すると、WCFは自動的にTaskを返しますか?
  • 上記の魔法のためには​​が必要ですか?もしそうでなければ、それはまったく効果がありますか?
  • サービスからのコールバックが「完了しました」または「ここにあなたの結果があります」と同じように、DoSomethingGetSomethingコールを同等に扱うことができますか?したがって、​​が必要な場合は、GetSomethingメソッドでも使用できますか?

答えて

0

サービスが一方向であるかどうかは、クライアントの技術とは関係ありません。 C#メソッドのセマンティクスでは、メソッドを返すのはvoidという意味です。

クライアントが.NETで実装されていて、ユーザーがブロック方法で呼び出すかどうかを選択すると、彼女/彼女の選択になります。

TAP (Task Asynchronous Patter)が導入される前は、APM (Asynchronous Programming Model)EAP (Event-based Asynchronous Pattern)がありました。正しくリコールすると、WCFはEAPを使用しました。

関連する問題