2016-09-16 9 views
2

私は私のwebサービスオブジェクト構築を非同期にすることは可能ですか?

private static async Task<DataClass> retrievData(){ 
... 
} 

から情報を取得async機能を持っているので、私が何かをしたい、私は私のコンストラクタでこの情報が必要ですが、私は私のアプリ

の残りの部分をブロックすることはできませんlike

public class MyClass { 
    private DataClass theData; 
    public async Myclass(){ 
      var dataTemp = await Server.retrievData(); 
      if(dataTemp.ValidatorNumber == Server.Validator.FULL) 
       theData = dataTemp 
      ... 
    } 

これは許可されていません。このための回避策はありますか?

+1

あなたがすることはできませんしかし、あなたはasyncファクトリメソッドを作ることができます。 stackoverflow.com/questions/8145479/can-constructors-be-async – jAC

+1

を参照してください[this](http://blog.stephencleary.com/2013/01/async-oop-2-constructors.html)blogpostをご覧ください。 – croxy

+0

私は間違った表現をしていると思いますが、これはどのように回避するのですか? – Umobuga

答えて

7

コンストラクタを作成することはできませんasync

public class MyClass { 
    private DataClass theData; 
    private Myclass(DataClass theData) { 
     this.theData = theData; 
    } 
    public static async MyClass Create() { 
     var dataTemp = await Server.retrievData(); 
     if(dataTemp.ValidatorNumber == Server.Validator.FULL) 
       return new DataClass(dataTemp); 
     ... // Deal with the error here 
    } 
} 

は今、発信者がこのように、非同期 MyClassのインスタンスを作るための方法があります:

var c = await MyClass.Create().ConfigureAwait(false); 
+0

私は同意します、これは回避策ですが、設計上の問題はありません。 –

+0

@SergeSemenovあなたの「いいえ」の推奨理由の説明を心掛けてください。私はこのアプローチでは特に異端的なものは見られません。このアプローチは、非同期的に取得されたデータのラッパーを構築することに至ります。 – dasblinkenlight

+0

1. MyClassはサーバーに密接に結合されています。 2.テストできません。 3.静的はほとんどの場合悪いです。 –

関連する問題