2016-09-16 5 views
2

У меня есть async функцию, извлекать информацию из моего WebServiceМожно ли построить объект асинхронным?

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

И мне нужна эта информация о моем конструкторе, но я не могу блокировать остальную часть моего приложения

, так что я хочу сделать что-то например

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

, но это недопустимо. Для этого есть обход?

+1

Вы не можете. См. Stackoverflow.com/questions/8145479/can-constructors-be-async – jAC

+1

Посмотрите на [это] (http://blog.stephencleary.com/2013/01/async-oop-2-constructors.html) blogpost , – croxy

+0

Я думаю, что я не ошибался, я имею в виду, как я обхожу это ... – Umobuga

ответ

7

Вы не можете сделать конструктор async. Тем не менее, вы можете сделать метод 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 Mind объясняет причины вашей рекомендации «нет-нет»? Я не вижу ничего такого «еретического» с этим подходом, который сводится к построению обертки для данных, полученных асинхронно. – dasblinkenlight

+0

1. MyClass тесно связан с сервером. 2. Не проверяем. 3. Статичность - это зло в большинстве случаев. –