gpt4 book ai didi

c# - 同时等待多个任务的设计模式

转载 作者:行者123 更新时间:2023-11-30 16:20:23 25 4
gpt4 key购买 nike

这是我的方法。我有几个 IEventProvider

interface IEventProvider
{
Task<Event> GetEvent();
}

然后我得到一个容器类来包装它们,并继续调用并等待 GetEvent() 以等待下一个事件,例如套接字异步接收、定时器滴答等。

class EventProviderContainer : IEventProvider
{
private IEventProvider[] _providers;
private Task<Event>[] _tasks;

public EventProviderContainer(params IEventProvider[] providers)
{
_providers = providers;
}

public async Task<Event> GetEvent()
{
// Fill the _tasks first time we call the method.
if (_tasks == null)
_tasks = (from p in _providers select p.GetEvent()).ToArray();

Task<Event> task = await Task<Event>.WhenAny(_tasks);

// Get the provider index whose previous task is done.
int index = Array.IndexOf(_tasks, task);
// put next event of the provider into array.
_tasks[index] = _providers[index].GetEvent();

return await task;
}
}

我觉得有点丑。这是更好的方法吗?

最佳答案

对于实际上不是那么简单的任务,您的代码非常简短且易于理解,我个人认为它并不难看。

我认为您不会找到更好的方法来编写此代码,除非您想更改整个界面。我唯一要改变的是移动初始化 _tasks给构造函数(但也许你有这样做的理由)。

但我同意 Stephen 的评论,对于事件,使用“推”语义通常比“拉”更合适。为此,Rx ( IObservable<Event> ) 或 TPL Dataflow ( ISourceBlock<Event> ) 将非常有用。在这两种情况下,写 EventProviderContainer会比较简单。两者中哪一个是更好的选择取决于您将如何处理结果。

关于c# - 同时等待多个任务的设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14275005/

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