同步实现异步方法

时间:2015-01-30 10:58:24

标签: c# asp.net asynchronous async-await

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

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

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

可以返回空Task以修复错误吗?

例如:

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

以下LocalDiskFilesManager实现会抛出异常,因为每个方法都应该返回一个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; });
    }
}

1 个答案:

答案 0 :(得分:3)

目前最好使用Task.FromResult

  

创建使用指定结果成功完成的Task<TResult>

E.g。

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;
}