2016-09-16 2 views
2

내 웹 서비스오브젝트 구성을 비동기로 만들 수 있습니까?

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 "아니오"권장 사항의 이유를 설명하는 마음? 비동기로 얻은 데이터에 대한 래퍼 (wrapper)를 구성하는 것과 같은이 접근법에서는 특히 "이단 적 (heretical)"한 어떤 것도 보지 못합니다. – dasblinkenlight

+0

1. 서버에 stronly 결합 된 MyClass. 2. 테스트 할 수 없습니다. 3. 정적은 대부분의 경우 악합니다. –

관련 문제