gpt4 book ai didi

c# - 将基于事件的代码转换为 Rx

转载 作者:太空狗 更新时间:2023-10-29 21:27:53 24 4
gpt4 key购买 nike

我有以下代码(为发布目的而简化)。

public class SomeDataObject
{
public delegate void ReadyEventHandler;
public delegate void ErrorEventHandler;

public event ReadyEventHandler Ready;
public event ErrorEventHandler Error;
...
}

pubic class ConsumerClass
{
private SomeDataObject dataObject;

private Task<List<string>> GetStrings()
{
List<string> results = new List<string>();
var tcs = new TaskCompletionSource<List<string>>();

SomeDataObject.ReadyEventHandler ReadyHandler = null;
SomeDataObject.ErrorEventHandler ErrorHandler = null;

ReadyHandler += () =>
{
for (int i =0; i < dataObject.ItemCount; i++)
results.Add(dataObject[i].ToString());

tcs.TrySetResult(results);
}

ErrorHandler += ()
{
tcs.TrySetException(new Exception("oops!");
}

dataObject.Ready += ReadyHandler;
dataObject.Error += ErrorHandler;

dataObject.DoRequest();
}
}

想法是,当调用 DoRequest 时,SomeDataObject 将获取一些数据并引发 Ready 或 Error 事件(细节不重要!)。如果数据可用,则 ItemCount 指示有多少项目可用。

我是 Rx 的新手,找不到任何可比较的例子。那么是否可以将其转换为 Rx 以便 IObservable<string>返回而不是 Task<List<string>>以某种方式使用 Observable.Create?

问候艾伦

最佳答案

Matthew 的答案很接近,但有一些问题。首先,它是渴望的,这通常不符合 Rx/函数式编程的精神。接下来,我认为您将希望能够在消费者处理时释放事件句柄。最后一个主题的用法应该是代码味道,这种情况它指向上面的两个问题:-)

在这里,我使用 Observable.Create(这应该是工具箱中排名第一的 goto 工具,subjects 是你最后的选择)来延迟连接,并在处理订阅时提供断开连接/释放事件。

private IObservable<string> GetStrings()
{
return Observable.Create<string>(o=>
{
SomeDataObject.ReadyEventHandler ReadyHandler = null;
SomeDataObject.ErrorEventHandler ErrorHandler = null;

ReadyHandler += () =>
{
for (int i =0; i < dataObject.ItemCount; i++)
o.OnNext(dataObject[i].ToString());

o.OnCompleted();
}

ErrorHandler += () =>
{
o.OnError(new Exception("oops!"));
}

dataObject.Ready += ReadyHandler;
dataObject.Error += ErrorHandler;

dataObject.DoRequest();

return Disposable.Create(()=>
{
dataObject.Ready -= ReadyHandler;
dataObject.Error -= ErrorHandler;
});
}
}

我也会考虑将 dataObject 移动到方法的参数中。在异步系统中共享状态是问题的根源。

关于c# - 将基于事件的代码转换为 Rx,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21691702/

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