假设我有100个类,它们使用“计算”方法实现公共接口。其中一些类将执行异步(例如读取文件),而实现相同接口的其他类将执行同步代码(例如添加两个数字)。为维护和性能编写代码的好方法是什么?
到目前为止,我读到的帖子总是推荐让异步/等待方法泡到调用者面前。因此,如果您有一个操作是异步的,那么让调用者异步,然后它的调用者异步,依此类推。因此,这使我认为接口应该是一个异步接口。但是,这在用同步代码实现接口时会产生问题。
我想到的一个想法是在接口中公开两个方法,一个异步和一个同步,以及一个布尔属性来告诉调用者调用哪个方法。不过这看起来会很难看。
我目前拥有的代码只是一个接口方法,即异步。然后,对于同步的实现,它们将代码包装在Task对象中:
using System.IO;
using System.Threading.Tasks;
namespace TestApp
{
interface IBlackBox
{
Task<string> PullText();
}
sealed class MyAsyncBlackBox : IBlackBox
{
public async Task<string> PullText()
{
using (var reader = File.OpenText("Words.txt"))
{
return await reader.ReadToEndAsync();
}
}
}
sealed class MyCachedBlackBox : IBlackBox
{
public Task<string> PullText()
{
return Task.Run(() => "hello world");
}
}
}这是创建和实现接口的正确方法吗?我有很多实现短同步操作的类,并且担心这会增加很多开销。还有别的方法可以让我失去吗?
发布于 2019-04-01 01:17:18
通常在这些情况下,在调用之前有一些东西是处理请求并将其传递给"worker“类(例如TestApp)。如果是这样的话,我不明白为什么有一个"IAsyncable“接口可以测试类是否能够异步工作。
if(thisObject is IAscyncAble) {
... call the ansync request.
}发布于 2019-04-02 02:33:47
最后,我使用了以下代码:
using System.IO;
using System.Threading.Tasks;
namespace TestApp
{
interface IBlackBox // interface for both sync and async execution
{
Task<string> PullText();
}
sealed class MyAsyncBlackBox : IBlackBox
{
public async Task<string> PullText()
{
using (var reader = File.OpenText("Words.txt"))
{
return await reader.ReadToEndAsync();
}
}
}
sealed class MyCachedBlackBox : IBlackBox
{
public Task<string> PullText() // notice no 'async' keyword
{
return Task.FromResult("hello world");
}
}
}https://stackoverflow.com/questions/55446876
复制相似问题