我正在努力解决关于订阅Observable.FromEventPattern()
on的问题上的一些并发问题TaskPoolScheduler
.
让我用代码示例来说明:
var dataStore = new DataStore();
Observable.FromEventPattern<DataChangedEventArgs>(dataStore, nameof(dataStore.DataChanged))
.SubscribeOn(TaskPoolScheduler.Default)
.Select(x => x.EventArgs)
.StartWith(new DataChangedEventArgs())
.Throttle(TimeSpan.FromMilliseconds(25))
.Select(x =>
{
Thread.Sleep(5000); // Simulate long-running calculation.
var result = 42;
return result;
})
.ObserveOn(new SynchronizationContextScheduler(SynchronizationContext.Current))
.Subscribe(result =>
{
// Do some interesting work with the result.
// ...
// Do something that makes the DataStore raise another event.
dataStore.RaiseDataChangedEvent(); // <- DEADLOCK!
});
dataStore.RaiseDataChangedEvent(); // <- Returns immediately, i.e. does NOT wait for long-running calculation.
dataStore.RaiseDataChangedEvent(); // <- …
Run Code Online (Sandbox Code Playgroud) 我一直在仔细搜索网络,以获取有关此方面的任何指导,讨论或经验,我认为我可以肯定地说没有任何东西。
我们正在为UWP开发一套控件,我们计划将其开源并免费提供。我们正在构建的控件之一是TimeSpanPicker
控件,其外观和行为本质上与TimePicker
控件类似,但是它不仅限于一天中的某个时间(即24小时间隔),还允许用户编辑任意内容TimeSpan
。
通过使用内置TimePicker
控件作为参考,从Windows Runtime API的可见元数据中整理出的内容,使我意识到涉及以下类型的组件:
Control
PickerFlyoutBase
Control
我意识到我需要模仿这种模式并为选择器控件编写这三个组件,但是我找不到有关这些组件如何组合在一起的信息,仅凭API表面,我认为不可能弄清楚。
具体来说,我想了解的主要内容是:
TimePickerFlyout
纳入TimePicker
班级?我在选择器控件的默认模板内的任何地方都看不到弹出按钮的引用。TimePickerFlyoutPresenter
控制播放,以及它是如何并入TimePickerFlyout
类?本TimePickerFlyout
类没有模板-那么它是如何实例化和与通信TimePickerFlyoutPresenter
控制?ShouldShowConfirmationButtons
和OnConfirmed
虚拟方法的预期用途是PickerFlyoutBase
什么?当我在具体的实现中覆盖它们时,就永远不会调用它们。如有任何指导,我将非常感谢!