同步实现异步方法

Implementing asynchronously methods synchronously

我有一个抽象 class FilesManager 管理一些文件。

这些方法被标记为Task<>,因为我可能通过http request将文件保存/读取到云服务器,所以我想将它们标记为asynchronous

但是,现在,我将文件保存在本地磁盘上,synchronusly

可以 return 清空 Task 以修复错误吗?

例如:

return Task.Factory.StartNew(() => { return; });

以下 LocalDiskFilesManager 的实现会抛出异常,因为每个方法都需要 return 一个 Task<> 对象。

public abstract class FilesManager
{
    public abstract Task SaveFileAsync(XDocument xDocument);
    public abstract Task<XDocument> GetFileAsync(Guid file_Id);
}

// Synchronously
public class LocalDiskFilesManager : FilesManager
{
    public override Task SaveFileAsync(XDocument xDocument)
    {
        string path = GetFilePath();
        xDocument.Save(path);

        // is ok to return an empty task? does it affects the performance / threads?
        // return Task.Factory.StartNew(() => { return; });
    }

    public override Task<XDocument> GetFileAsync(Guid file_Id)
    {
        string path = GetFilePath(file_Id);
        XDocument xDocument = XDocument.Load(path);

        return xDocument;

        // is ok to return an empty task? does it affects the performance / threads?
        // return Task<XDocument>.Factory.StartNew(() => { return xDocument; });
    }
}

现在最好使用 Task.FromResult

Creates a Task<TResult> that's completed successfully with the specified result.

例如

public override Task<XDocument> GetFileAsync(Guid file_Id)
{
    string path = GetFilePath(file_Id);
    XDocument xDocument = XDocument.Load(path);

    return Task.FromResult(xDocument);
}

这避免了实际安排一个单独的任务,因此应该解决您的线程问题。

对于非泛型 Task,我通常会这样做:

private static Task _alreadyDone = Task.FromResult(false);

public override Task SaveFileAsync(XDocument xDocument)
{
    string path = GetFilePath();
    xDocument.Save(path);

    return _alreadyDone;
}