Как вызвать асинхронный метод из синхронного метода в C #? - PullRequest
665 голосов
/ 18 февраля 2012

У меня есть метод public async void Foo(), который я хочу вызвать из синхронного метода. До сих пор все, что я видел из документации MSDN, это вызов асинхронных методов через асинхронные методы, но вся моя программа не построена с асинхронными методами.

Возможно ли это вообще?

Вот один пример вызова этих методов из асинхронного метода: http://msdn.microsoft.com/en-us/library/hh300224(v=vs.110).aspx

Теперь я собираюсь вызвать эти асинхронные методы из методов синхронизации.

Ответы [ 14 ]

2 голосов
/ 21 июня 2018
var result = Task.Run(async () => await configManager.GetConfigurationAsync()).ConfigureAwait(false);

OpenIdConnectConfiguration config = result.GetAwaiter().GetResult();

Или используйте это:

var result=result.GetAwaiter().GetResult().AccessToken
0 голосов
/ 29 апреля 2019

Если вы хотите запустить его Sync

MethodAsync().RunSynchronously()
0 голосов
/ 13 июня 2015

В этих асинхронных методах Windows есть изящный маленький метод AsTask ().Вы можете использовать это, чтобы метод возвращал себя в качестве задачи, чтобы вы могли вручную вызывать Wait () для него.

Например, в приложении Windows Phone 8 Silverlight вы можете сделать следующее:*

private void DeleteSynchronous(string path)
{
    StorageFolder localFolder = Windows.Storage.ApplicationData.Current.LocalFolder;
    Task t = localFolder.DeleteAsync(StorageDeleteOption.PermanentDelete).AsTask();
    t.Wait();
}

private void FunctionThatNeedsToBeSynchronous()
{
    // Do some work here
    // ....

    // Delete something in storage synchronously
    DeleteSynchronous("pathGoesHere");

    // Do other work here 
    // .....
}

Надеюсь, это поможет!

0 голосов
/ 29 июля 2014
   //Example from non UI thread -    
   private void SaveAssetAsDraft()
    {
        SaveAssetDataAsDraft();
    }
    private async Task<bool> SaveAssetDataAsDraft()
    {
       var id = await _assetServiceManager.SavePendingAssetAsDraft();
       return true;   
    }
   //UI Thread - 
   var result = Task.Run(() => SaveAssetDataAsDraft().Result).Result;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...