C# 接口,其中一个实现需要异步

C# 接口,其中一个实现需要异步,c#,asynchronous,async-await,windows-10-mobile,C#,Asynchronous,Async Await,Windows 10 Mobile,我有一个接口,它为我提供了一条特定的路径。在我的一个实现中,我需要使用async,但我还没有弄清楚如何将异步方法的结果转换为同步方法。以下是代码示例: 接口: public interface IFilePath { string GetAsset(); } 有问题的执行: public class FilePath : IFilePath { public string GetAsset() { return GetAssetAssync();

我有一个接口,它为我提供了一条特定的路径。在我的一个实现中,我需要使用
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;
    }
}
公共类文件路径:IFilePath
{
公共字符串GetAsset()
{
返回getAssetAsync();
}
专用异步任务GetAssetAsync()
{
StorageFolder AssetFolder=await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFolderAsync(@“资产”).AsTask().ConfigureAwait(false);
返回assetsFolder.Path;
}
}

仅对于这个实现,我需要异步调用。其他所有人都不需要它。因此,我不能使用
公共任务GetAsset()
或者我可以以某种方式使用吗?

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

public interface IFilePath
{
  Task<string> GetAssetAsync();
}

你的问题是什么?在接口中添加两个签名,或创建单独的仅异步库。(死锁、异常处理)。
.Result
。但是,一般来说,您最好只提供异步版本,让调用方自己调用
。如果他们坚持使用同步版本,则自己调用
,而不是自己包装。这鼓励其他调用者也使用异步版本,而不是采取简单的方式编写(包装效率低的)阻塞代码。@测试但您的接口不能同时是同步和异步的(除非您提供每个实现都必须实现的两种不同方法)。因此,您需要决定是否希望接口是异步的,让客户端决定是异步调用还是同步调用,或者使其同步并同步调用特定的异步实现。考虑到您的代码显然应该在Windows Mobile上运行,不管怎样,异步完成可能涉及I/O或其他冗长操作的所有工作似乎都是一种最佳实践。如果您的接口有一个异步方法,但调用方需要一个同步实现,那么在调用方端实现这一点很简单(以牺牲效率为代价)。相反的情况(只有一个同步实现需要包装为异步)在开销方面更糟糕。多亏了
async
/
await
,异步方法几乎不难使用。
Task.FromResult(“字符串”)
。除此之外,如果在实现中使用Task.FromResult,我将记录它将阻止您亲爱的桌面应用程序开发人员的调用线程,他们希望能够等待此消息并保持其UI线程未被阻止,但发现他们被阻止了.FromResult的实现细节。
class SynchronousFilePath: IFilePath
{
  public string GetAsset(); // natural synchronous implementation

  public Task<string> GetAssetAsync()
  {
    return Task.FromResult(GetAsset());
  }
}