У меня есть интерфейс, который доставляет мне определенный путь. В одной из моих реализаций мне нужно использовать async
, но я не понял, как получить результат асинхронного метода в синхронный метод. Вот пример кода:Интерфейс, где одна из реализаций должна быть асинхронной
Интерфейс:
public interface IFilePath
{
string GetAsset();
}
Проблемной реализация:
public class FilePath : IFilePath
{
public string GetAsset()
{
return GetAssetAssync();
}
private async Task<string> GetAssetAssync()
{
StorageFolder assetsFolder = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFolderAsync(@"Assets").AsTask().ConfigureAwait(false);
return assetsFolder.Path;
}
}
Только для этого мне нужно выполнения вызова асинхронного. Все остальные не нужны. Поэтому я не могу использовать public Task<string> GetAsset()
или могу ли я как-нибудь?
Каков ваш вопрос? Либо добавьте обе подписи в интерфейсе, либо создайте отдельную библиотеку только для асинхронного доступа. [Конечно, не вызывайте '... Async(). Результат из синхронного кода] (http://stackoverflow.com/questions/22628087/calling-async-method-synchronously) (взаимоблокировки, обработка исключений). – CodeCaster
'.Result'. Однако, в общем, вам лучше предлагать только асинхронную версию и оставлять ее вызывающим абонентам для вызова '.Result' сами, если они настаивают на синхронной версии, а не на ее обертку самостоятельно. Это побуждает других абонентов использовать асинхронную версию, вместо того, чтобы легко и быстро записывать (неэффективно завернутый) код блокировки. –
Или вы могли бы просто сделать GetAssetAssync(). ConfigureAwait (false); 'который не будет deadlock –