これが私のアプローチです。私はいくつか持っていますIEventProviders
、
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;
}
}
ちょっとカッコ悪いと思います。それを行うより良い方法はありますか?