我正在围绕第 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/