2016-02-16 6 views
2

У меня есть класс, наследующий я, и у меня нет доступа к базовому классу. Я переопределяю метод этого базового класса, и этот метод не является асинхронным, но мне нужно, чтобы он вызывал метод async, который я создал. Как так:вызов метода async внутри метода non-async

public class OverridingClass : BaseClass 
{ 
    public override bool TestMethod() 
    { 
     var res = engine.DoAsyncFunction().Result; 
     //do stuff with res value 
    } 
} 

это лучше использовать этот метод, когда я вынимаю значение «результат», или я должен добавить новый, синхронный метод двигателя, а и игнорировать его функции асинхронной полностью, как и ?

public class OverridingClass : BaseClass 
{ 
    public override bool TestMethod() 
    { 
     var res = engine.DoFunction(); 
     //do stuff with res value 
    } 
} 

или есть что-то еще, что я могу сделать полностью для переопределенной функции, чтобы сделать ее асинхронной? Если я пытаюсь сделать перекрытый метод:

public async override Task<bool> TestMethod()... 

тогда я получаю ошибку компиляции говорит, что метод не соответствует базовой подписи.

+0

вы хотите, чтобы она вызывалась синхронизации на UI потоке или называется асинхронной? –

+3

Лично я бы предпочел, чтобы последний подход. Если это не «асинхронный путь вниз», тогда есть проблемы. И даже обойти это и ожидание результата задачи только в конечном итоге сделает его синхронным в любом случае, так что это может быть просто и явно синхронно. – David

+2

@Phil: Я описываю [несколько различных подходов к этой проблеме с плюсами и минусами каждого) (https://msdn.microsoft.com/en-us/magazine/mt238404.aspx) в статье MSDN. –

ответ

4

Вы можете обернуть его в Task.Run() как следующее, если вы хотите, чтобы назвать asynchrounously:

public override bool TestMethod() 
{ 
    var task = Task.Run(async() => { 

     return await engine.DoAsyncFunction(); 

    }); 

    var Result = task.Result; // use returned result from async method here 
} 
+0

Честно говоря, это полностью проглотило мой разум. Огромное спасибо! – Phil

+6

Это не делает ничего результативным; он делает то, что OP уже делает, но тратит целую кучу дополнительных ресурсов в этом процессе. – Servy

+0

@Servy Если реализация 'engine.DoAsyncFunction()' дает вызывающему абоненту 'await', а затем вы вызываете' Wait() 'на нем, это потенциальный тупик. Увольнение новой задачи не очень красиво, но оно не будет заторможено. – piedar

Смежные вопросы