首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为有时只有异步的操作创建和实现接口

如何为有时只有异步的操作创建和实现接口
EN

Stack Overflow用户
提问于 2019-04-01 00:57:43
回答 2查看 281关注 0票数 2

假设我有100个类,它们使用“计算”方法实现公共接口。其中一些类将执行异步(例如读取文件),而实现相同接口的其他类将执行同步代码(例如添加两个数字)。为维护和性能编写代码的好方法是什么?

到目前为止,我读到的帖子总是推荐让异步/等待方法泡到调用者面前。因此,如果您有一个操作是异步的,那么让调用者异步,然后它的调用者异步,依此类推。因此,这使我认为接口应该是一个异步接口。但是,这在用同步代码实现接口时会产生问题。

我想到的一个想法是在接口中公开两个方法,一个异步和一个同步,以及一个布尔属性来告诉调用者调用哪个方法。不过这看起来会很难看。

我目前拥有的代码只是一个接口方法,即异步。然后,对于同步的实现,它们将代码包装在Task对象中:

代码语言:javascript
复制
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");
        }
    }
}

这是创建和实现接口的正确方法吗?我有很多实现短同步操作的类,并且担心这会增加很多开销。还有别的方法可以让我失去吗?

EN

回答 2

Stack Overflow用户

发布于 2019-04-01 01:17:18

通常在这些情况下,在调用之前有一些东西是处理请求并将其传递给"worker“类(例如TestApp)。如果是这样的话,我不明白为什么有一个"IAsyncable“接口可以测试类是否能够异步工作。

代码语言:javascript
复制
if(thisObject is IAscyncAble) {
  ... call the ansync request.
}
票数 1
EN

Stack Overflow用户

发布于 2019-04-02 02:33:47

最后,我使用了以下代码:

代码语言:javascript
复制
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");
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55446876

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档