- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个由触摸事件组成的可观察序列:
var touchEvents = Observable.Merge(
Observable.FromEventPattern<RoutedEventArgs>(touchRect, nameof(touchRect.PointerEntered)),
Observable.FromEventPattern<RoutedEventArgs>(touchRect, nameof(touchRect.PointerExited)),
Observable.FromEventPattern<RoutedEventArgs>(touchRect, nameof(touchRect.PointerReleased)));
我观察直到满足特定条件:
async void Start()
{
_scanSlapObservable = touchEvents.Throttle(TimeSpan.FromSeconds(1))
.Where(e => countOfPointers == expectedFingers.Length)
.Select(e => new Response())
.FirstOrDefaultAsync();
Response response = await _scanSlapObservable;
if (response != null)
{
//do something
}
}
当我两次调用 Start()
时,我想中断现有的 _scanSlapObservable
,因此它要么返回 null 要么抛出异常。
如何中断现有的 IObservable 序列?
最佳答案
这是一个 Linqpad 友好的解决方案。丑陋,但它有效:
async Task Main()
{
var sc = new ScanClass();
sc.Start();
sc.touchEvents.OnNext(Unit.Default);
sc.touchEvents.OnNext(Unit.Default);
sc.Start();
sc.touchEvents.OnNext(Unit.Default);
sc.touchEvents.OnNext(Unit.Default);
await Task.Delay(TimeSpan.FromSeconds(1));
}
// Define other methods and classes here
class ScanClass
{
IObservable<Response> _scanSlapObservable;
public Subject<Unit> _interrupter = new Subject<Unit>();
public Subject<Unit> touchEvents = new Subject<Unit>();
public async Task Start()
{
_interrupter.OnNext(Unit.Default);
_scanSlapObservable = touchEvents
.Throttle(TimeSpan.FromSeconds(1))
// .Where(e => countOfPointers == expectedFingers.Length)
.Select(e => new Response())
.TakeUntil(_interrupter)
.FirstOrDefaultAsync();
Response response = await _scanSlapObservable;
if (response != null)
{
//do something
Console.WriteLine("Do Something");
}
else
{
Console.WriteLine("Null Response");
}
}
}
class Response { }
我认为最好的方法是使用 Switch
样式,尽管它不适用于您的 Task
。我认为很大一部分丑陋是将 Task
API 与 Rx 混合在一起。以下是仅 Rx 解决方案的样子:
class ScanClass
{
public Subject<Unit> _starter = new Subject<Unit>();
public Subject<Unit> touchEvents = new Subject<Unit>();
public ScanClass()
{
_starter.Select(_ => touchEvents
.Throttle(TimeSpan.FromSeconds(1))
// .Where(e => countOfPointers == expectedFingers.Length)
.Select(e => new Response())
)
.Switch()
.Subscribe(r => Console.WriteLine("Do Something."));
}
public async Task Start()
{
_starter.OnNext(Unit.Default);
}
}
...理想情况下,您可以将 Start()
和 _starter
替换为某种 Observable.FromEvent
。
关于c# - 如何中断现有的 IObservable 序列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41144774/
假设我有一个返回 IObservable 的函数并且这个函数需要初始状态。 let myObservable (initialState: T) :IObservable = (...) 但我只能从另
假设我有一个返回 IObservable 的函数并且这个函数需要初始状态。 let myObservable (initialState: T) :IObservable = (...) 但我只能从另
我有一个鼠标左键状态流: var leftMouseButton = mouse.Select(x => x.LeftButton).DistinctUntilChanged(); 然后我Window
我有一个“值(value)观”IObservable这是返回 T必须按顺序组合成可变长度数组的元素,我有一个“控制”IObservable这告诉我下一个数组必须有多长。删除一个元素、重复它或将结果打乱
微软推出了 IObservable interface到 BCL 与 .NET Framework 4,我想,“太棒了,终于,我必须使用它!”因此,我深入挖掘并阅读帖子和文档,甚至实现了该模式。 这样
我有一个 IObservable 类型的流(热可观察)并想将其分成 IObservable 的两个可观察对象和 IObservable 我天真地尝试了以下但我只得到 flowStream人口稠密。 I
在 Windows Phone 7 上,IObservable 有一个新版本的 BufferWithTimeOrCount 扩展方法,它返回“流的流”而不是以前的“列表流”。我在尝试使用新方法或旧方法
更新:查看底部的示例 我需要在课间发消息。发布者将无限循环,调用一些方法来获取数据,然后将该调用的结果传递给 OnNext .可以有很多订阅者,但应该只有一个 IObservable 和一个长期运行的
我想创建一个可用于表示动态计算值的类,而另一个表示值的类可以是这些动态计算值的源(主题)。目标是当主题发生变化时,计算值会自动更新。 在我看来,使用 IObservable/IObserver 是可行
我有一个返回接口(interface) IObservable 的方法(在 silverlight 中)并希望将其转换为另一个 IObservable ? 那么我需要用什么来代替“CONVERT_SO
这两种方法有什么区别,每种方法的最佳情况是什么?我知道他们都能够附加一个函数来处理来自 IObservable 的排放,但我并不真正理解除此之外的差异。 编辑 对不起,我应该指定的。 IObserva
我的系统有很多状态对象——连接状态、CPU 负载、登录用户等等。所有此类事件都合并到单个可观察流中。 我想制作一个管理实用程序来显示系统的实际状态并显示所有这些计数器。 我如何创建一个包含所有计数器的
我有一个 IObservable我把它变成一个IObservable使用一些中间步骤: var observedXDocuments = from b in observedBytes
Although it is possible to attach an observer to multiple providers, the recommended pattern is to a
在我当前正在开发的系统中,我有许多被定义为接口(interface)和基类的组件。系统的每个部分都有一些与系统其他部分交互的特定点。 例如,数据准备组件准备了一些数据,最终需要进入数据处理部分,通信组
我有一个 IObservable包含 XML 文档(的片段)。我想把一个变成另一个。因此,例如,假设我有以下从我的 IObservable 推送的片段(每行包含一个片段): 获取以下文件: 我一
我有一个 IObservable这给了我字节数组中不确定数量的字节。我想知道我是如何从那开始返回 IObservable 的每个字节数组中有一定数量的字节。假设我们一次需要 10 个字节。 也就是说,
我在我的一个项目中使用了 IObserver/IObservable 接口(interface)。 CommandReader 是一个 IObservable,它不断从流中读取数据,然后将其传递给它的
例如,考虑一下: public IDisposable Subscribe(IObserver observer) { return eventStream.Where
当我写 .Subscribe 时我经常发现 Resharper 为我选择了以下重载,位于 mscorlib 中,Version=4.0.0.0: namespace System { public
我是一名优秀的程序员,十分优秀!