あなたは反応性に非常に単純にこれを行うことができます。
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);
}
}
}
は、コールバックメソッドは、実際にそれを許可していないので、これは、キャンセルのようなものの世話をしないことに注意してください。適切な解決方法では、外部ライブラリの一部での作業が必要になります。ここで
サードパーティライブラリの正確なフローを説明できますか?既に複数のスレッドに生成されているようです。また、マルチキャストの代理人がいるかもしれないことに注意してください。また、スキャンが終了したことをどのように判断していますか? – weismat
正直言って、私はこれを行う際に値を見ることができません。もしあなたが 'foreach(scannable.Scan())のオブジェクトobj {/ * obj * /}で何かする' 'を実行したいのであれば、' scannable.Scan(obj => {/ * obj * /}); '? – Flynn1179
@ weismat:いいえ、スレッドを生成しません。基本的に内部的にデータストアに対して反復処理を行い、各レコードのコールバックを呼び出します。 – Gareth