gpt4 book ai didi

c# - 订阅并在第一次操作后立即取消订阅

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

我想订阅 IObservable<T>并在收到 T 类型的第一个元素后取消订阅(处理)订阅权,即我只想在订阅后获得的第一个元素上调用操作。

这是我想出的方法:

public static class Extensions
{
public static void SubscribeOnce<T>(this IObservable<T> observable, Action<T> action)
{
IDisposable subscription = null;
subscription = observable.Subscribe(t =>
{
action(t);
subscription.Dispose();
});
}
}

示例用法:

public class Program
{
public static void Main()
{
var subject = new Subject<int>();

subject.OnNext(0);
subject.OnNext(1);
subject.SubscribeOnce(i => Console.WriteLine(i));
subject.OnNext(2);
subject.OnNext(3);

Console.ReadLine();
}
}

它按预期工作,只打印 2 . 这有什么问题或需要考虑的其他问题吗?是否有更简洁的方法使用 RX 开箱即用的扩展方法?

最佳答案

var source = new Subject();

source
.Take(1)
.Subscribe(Console.WriteLine);

source.OnNext(5);
source.OnNext(6);
source.OnError(new Exception("oops!"));
source.OnNext(7);
source.OnNext(8);

// Output is "5". Subscription is auto-disposed. Error is ignored.

Takenth 元素产生后自动处理订阅。 :)

至于其他需要考虑的事情,对于您的自定义可观察对象,您应该注意您可能还想将 OnError 和 OnCompleted 通知传递给您的观察者,Take 也会为您处理这些通知。

内置运算符还有其他好处,例如更好的 Dispose 处理。

关于c# - 订阅并在第一次操作后立即取消订阅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22786712/

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