2 つのコレクション間の作業を非同期かつ並列にシミュレートしようとしています。顧客の ConcurrentQueue とワーカーのコレクションがあります。ワーカーがキューから顧客を取得し、顧客に対して作業を実行し、完了したらすぐに別の顧客を取得する必要があります。
私は、ワーカーのコレクションが顧客に対してアクションを実行するイベント ベースのパラダイムを使用することにしました。顧客が完了したときに起動するイベント ハンドラーを保持するユーザー。うまくいけば、DoWork メソッドをもう一度起動して、ワーカーを並列化してキューから顧客を取り出すことができます。しかし、OnCustomerFinished() で顧客を DoWork に渡す方法がわかりません! 労働者は明らかに顧客の列に依存すべきではありません
public class Worker
{
public async Task DoWork(ConcurrentQueue<Customer> cust)
{
await Task.Run(() =>
{
if (cust.TryDequeue(out Customer temp))
{
Task.Delay(5000);
temp.IsDone = true;
}
});
}
public void OnCustomerFinished()
{
// This is where I'm stuck
DoWork(~HOW TO PASS THE QUEUE OF CUSTOMER HERE?~);
}
}
// 編集 - これは顧客クラスです
public class Customer
{
private bool _isDone = false;
public EventHandler<EventArgs> CustomerFinished;
public bool IsDone
{
private get { return _isDone; }
set
{
_isDone = value;
if (_isDone)
{
OnCustomerFinished();
}
}
}
protected virtual void OnCustomerFinished()
{
if (CustomerFinished != null)
{
CustomerFinished(this, EventArgs.Empty);
}
}
}