c# - 可以将回调调用转换为 IEnumerable

标签 c# callback enumerable

我正在围绕第 3 方库编写一个包装器,它有一种方法可以扫描它管理的数据。该方法采用一个回调方法,它会为它找到的数据中的每个项目调用该方法。

例如该方法本质上是:void Scan(Action<object> callback);

我想包装它并公开一个类似 IEnumerable<object> Scan(); 的方法

如果不求助于单独的线程来执行实际扫描和缓冲区,这是否可能?

最佳答案

您可以使用 Reactive 非常简单地做到这一点:

class Program
{
    static void Main(string[] args)
    {
        foreach (var x in CallBackToEnumerable<int>(Scan))
            Console.WriteLine(x);
    }

    static IEnumerable<T> CallBackToEnumerable<T>(Action<Action<T>> functionReceivingCallback)
    {
        return Observable.Create<T>(o =>
        {
            // Schedule this onto another thread, otherwise it will block:
            Scheduler.Later.Schedule(() =>
            {
                functionReceivingCallback(o.OnNext);
                o.OnCompleted();
            });

            return () => { };
        }).ToEnumerable();
    }

    public static void Scan(Action<int> act)
    {
        for (int i = 0; i < 100; i++)
        {
            // Delay to prove this is working asynchronously.
            Thread.Sleep(100);
            act(i);
        }
    }
}

请记住,这不会处理取消之类的事情,因为回调方法实际上不允许这样做。一个合适的解决方案需要外部库的部分工作。

关于c# - 可以将回调调用转换为 IEnumerable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4955607/

相关文章:

javascript - 更改回调函数名称

c++ - 抽象基类 C++ 中的静态回调

ruby - 为什么#each_with_object 和#inject 会切换 block 参数的顺序?

c# - foreach循环,在循环语句外导出迭代集合是不是更快?

c# - xUnit 用假的第三方类实例替换第三方类实例

c# - 我可以在 LINQ to Entities 中动态构建 where 子句吗?

javascript - 在 promise javascript 中从 sinon.spy 获取回调参数

Ruby 枚举方法示例

c# - 如何在c#中使用动态语法?

c# - 注入(inject) InSingletonScope 的对象是否也可以注入(inject)到其他地方的多重绑定(bind)中?