同步实现异步方法
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;
}
我有一个抽象 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;
}