gpt4 book ai didi

c# - (A)等待多个实例恰好引发一次事件

转载 作者:太空宇宙 更新时间:2023-11-03 23:10:32 25 4
gpt4 key购买 nike

我有一个列表,这个 SomeAttachmentClass 有一个 UploadCompleted 事件,在调用 .Save() 方法时,只引发一次。该 .Save() 方法在保存并因此上传实际完成之前不会阻塞,但会立即返回并通过所述事件发出完成信号。

现在我想要和需要做的基本上是等待 List<> 中的所有实例(准确地)引发该事件一次,然后才继续......问题是 - 我将如何最简单地做到这一点/优雅?

我正在考虑在每个实例上结合使用 RX 的 FromEvent(..) 和 .Take(1),对所有这些实例流执行 .SelectMany() 并等待……但我不确定是否那里有更好的出路。

最佳答案

这有助于解决问题 - 感谢 Shlomo 的起点。

void Main()
{

Func<SomeAttachment, IObservable<object>> save = sa =>
Observable.Create<object>(o =>
{
var ob =
Observable
.FromEventPattern<object>(
eh => sa.UploadCompleted += eh,
eh => sa.UploadCompleted -= eh)
.Take(1)
.Select(x => x.EventArgs);
var subscription = ob.Subscribe(o);
sa.Save();
return subscription;
});

var list = Enumerable.Range(0, 10).Select(i => new SomeAttachment(i)).ToList();

list
.ToObservable()
.SelectMany(o => save(o))
.ToArray()
.Subscribe(_ => Console.WriteLine("All Complete. Handling logic goes here."));
}

public class SomeAttachment
{
private static Random random = new Random();
private readonly int _id;
public SomeAttachment(int id)
{
_id = id;
}
public int Id
{
get { return _id; }
}

public async Task Save()
{
//await Task.Delay(TimeSpan.FromMilliseconds(random.Next(1000, 3000)));
UploadCompleted?.Invoke(this, new object());
}

public event EventHandler<object> UploadCompleted;
}

关于c# - (A)等待多个实例恰好引发一次事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39385785/

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