0

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);
        }
    }
}
4

1 に答える 1