我有一个抽象类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; });
}
}
答案 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;
}