gpt4 book ai didi

c# - 使用 Rx 同步异步事件

转载 作者:太空狗 更新时间:2023-10-29 20:03:53 25 4
gpt4 key购买 nike

我想把Reactive Extensions for .NET (Rx)善用,并希望获得一些关于完成一些基本任务的意见。为了说明我正在尝试做的事情,我有一个人为的示例,其中我有一个带有异步事件的外部组件:

class Component {

public void BeginStart() { ... }

public event EventHandler Started;

}

组件通过调用 BeginStart() 启动。此方法立即返回,稍后,当组件完成启动时,将触发 Started 事件。

我想通过包装组件来创建一个同步启动方法,并等待 Started 事件被触发。这是我到目前为止想出的:

class ComponentWrapper {

readonly Component component = new Component();

void StartComponent() {
var componentStarted =
Observable.FromEvent<EventArgs>(this.component, "Started");
using (var startedEvent = new ManualResetEvent(false))
using (componentStarted.Take(1).Subscribe(e => { startedEvent.Set(); })) {
this.componenet.BeginStart();
startedEvent.WaitOne();
}
}

}

我想摆脱 ManualResetEvent,我希望 Rx 有解决方案。但是如何呢?

最佳答案

PL's answer如果非常适合您的规范,但我认为您可能会通过不使用 .First() 对抗 RX 而通过为您的组件创建可观察对象来拥抱它来获得更好的结果:

    public static IObservable<Unit> AsObservable(this Component component)
{
return Observable.Defer(() =>
{
component.BeginStart();
return Observable
.FromEvent<EventArgs>(component, "Started")
.Select(_ => new Unit());
});
}

然后你可以将它用作阻塞:

new Component().AsObservable().First();

非阻塞:

new Component().AsObservable().Subscribe(_ => Console.WriteLine("Done"));

热门:

var pub = new Component().AsObservable().Publish();
pub.Subscribe(_ => Console.WriteLine("Sub1"));
pub.Subscribe(_ => Console.WriteLine("Sub2"));
pub.Connect(); // started just once per two subscriptions

可组合:

new Component().AsObservable().Delay(TimeSpan.FromSeconds(1));

等...

编辑:对于您必须等待并收集信息的多个事件的情况,可以使用以下变体:

public static IObservable<EventArgs> AsObservable(this Component component)
{
return Observable.Defer(() =>
{
component.BeginStart();
return
Observable.FromEvent<EventArgs>(component, "Started1").Take(1)
.Merge(
Observable.FromEvent<EventArgs>(component, "Started2").Take(1))
.Select(evt => evt.EventArgs);
});
}

有了这个,如果你想阻塞直到完成,你可以使用 .AsObservable.Last()

关于c# - 使用 Rx 同步异步事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2956195/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com