其中一个实现需要异步的接口

tes*_*ing 3 c# asynchronous async-await windows-10-mobile

我有一个界面,它为我提供了一条特定的路径.在我需要使用的一个实现中async,但我还没有弄清楚如何将异步方法的结果转换为同步方法.这是代码示例:

接口:

public interface IFilePath
{
    string GetAsset();
}
Run Code Online (Sandbox Code Playgroud)

有问题的实施:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

仅对于此实现,我需要异步调用.所有其他人都不需要它.所以我不能使用public Task<string> GetAsset()或者我可以以某种方式?

Ste*_*ary 6

任务返回方法指示实现可以是异步的.因此,最好的方法是更新您的接口以允许异步实现:

public interface IFilePath
{
  Task<string> GetAssetAsync();
}
Run Code Online (Sandbox Code Playgroud)

我会尝试使其他实现异步(文件I/O是一个自然的异步操作),但如果你有真正的同步实现(例如,从内存中的zip文件或其他东西读取),那么你可以将结果包装起来Task.FromResult:

class SynchronousFilePath: IFilePath
{
  public string GetAsset(); // natural synchronous implementation

  public Task<string> GetAssetAsync()
  {
    return Task.FromResult(GetAsset());
  }
}
Run Code Online (Sandbox Code Playgroud)