C# 4.0 如何用勺子喂入程序代码中的IObservable?
大多数关于被动扩展的示例代码都围绕着如何在序列上组合逻辑和运算符展开 围绕可观察生成的部分主要围绕“FromEventPatter”、“FromAsynch”等C# 4.0 如何用勺子喂入程序代码中的IObservable?,c#-4.0,system.reactive,C# 4.0,System.reactive,大多数关于被动扩展的示例代码都围绕着如何在序列上组合逻辑和运算符展开 围绕可观察生成的部分主要围绕“FromEventPatter”、“FromAsynch”等 IObservable observableHotStatus=??; foreach(todo中的var任务) { //过程任务; //将状态消息发布到observable;我如何做到这一点? } 简而言之,我想要一个可以发布到的对象,比如ActionBlock、Action(of T)或类似的东西。 最简单的方法是什么?编辑: 更
IObservable observableHotStatus=??;
foreach(todo中的var任务)
{
//过程任务;
//将状态消息发布到observable;我如何做到这一点?
}
简而言之,我想要一个可以发布到的对象,比如ActionBlock、Action(of T)或类似的东西。
最简单的方法是什么?编辑:
更仔细地检查代码,我建议使用Observable.Create
。即使它只返回一个冷的可观察对象,您也可以对生成的可观察对象应用Publish
操作符使其变热
如果通过task
您实际上指的是task
,那么您可以使用Observable.Create的重载来定义异步迭代器。例如:
IObservable<string> statuses = Observable.Create<string>(
(observer, cancel) =>
{
foreach (var task in todo)
{
cancel.ThrowIfCancellationRequested();
await task;
observer.OnNext("Status");
}
});
IObservable status=可观察。创建(
(观察员,取消)=>
{
foreach(todo中的var任务)
{
cancel.ThrowIfCancellationRequested();
等待任务;
OnNext观察员(“地位”);
}
});
先前的答案:
您可以使用以下类型之一,但我建议在做出决定之前先阅读
主题
:一般用途,“事件”类。调用OnNext
就像引发一个经典的.NET事件
BehaviorSubject
:通常用作属性的支持字段,它表示可观察到的更改“事件”序列。每当观察者订阅时,它会立即接收当前值,然后对属性进行所有更改。您可以随时从value
属性中提取当前值;e、 例如,在您的财产的getter中。在属性的setter中调用OnNext
,您不必保留重复的备份字段。它也是Rx的a版本,如果我对FRP的理解是正确的,那么它是Rx中唯一类似的东西
ReplaySubject
:通常用作“事件”的历史缓冲区,它表示一个可观察的值序列,从观察者错过的值开始,每当观察者订阅时。您可以控制缓冲的距离值;它就像一个滑动窗口,覆盖着价值的历史。您很少需要使用这种类型。在大多数情况下,Observable.Replay
操作符就可以了
AsyncSubject
:通常用于捕获热异步函数(如Task
)的结果。您很少需要使用这种类型。在大多数情况下,可观察。从AsyncPattern
或任务
-转换运算符即可
受试者为我做了这件事。我会考虑这些关注。谢谢你。可能的+2!这个答案可能在一段时间内比其他任何东西都更让我深思。坦克!
IObservable<string> statuses = Observable.Create<string>(
(observer, cancel) =>
{
foreach (var task in todo)
{
cancel.ThrowIfCancellationRequested();
await task;
observer.OnNext("Status");
}
});