1

生成が外部イベントに基づいているマルチスレッドのプロデューサー/コンシューマー プログラムを作成する方法を理解したいと考えています。

2 つのスレッド ループを持つ同期キューを作成しました。1 つはエンキューし、もう 1 つはデキューしてファイルに書き込みます。

Class SyncQueue  
{
    ...
    producerThread = new Thread(new ThreadStart(StartProducer));
    consumerThread = new Thread(new ThreadStart(StartConsumer));
    ...

    public void Start()
    {
        producerThread.Start();
        consumerThread.Start();
    }

    public void StartProducer()
    {
        while (!stop)
        { 
            //wait for an external event to happen 
            //Data data = eventHandler() : How to wait for an event and get?
            Enqueue(data);
        }
    }
}

反対側には、外部イベントを独立して処理する別のクラスのメソッドがあります。

public void OnExternalEvent()
{
    //event occured 
    //how to notify and send data to the producer thread?
}

私の質問は、生産者/消費者のパターンについてではなく、その中でイベントを統合することについてです。

投稿したコードは、質問を明確にするためのものです。コメントに2つの具体的な質問を追加しました。

どなたかやり方教えていただけるとありがたいです。私は C# の初心者であり、イベント処理に関する強いバックグラウンドを持っていません。

4

2 に答える 2

4

そのためにRx (Reactive extensions)を使用することを検討してください。それらは最新で、柔軟で、便利で、マルチスレッドをサポートしており、単純にクールです。彼は

コレクションを使用IObservable<T>すると、それらをサブスクライブするだけで、何かが変更 (投稿) された場合に通知を受け取ることができます。

これは、データを投稿する方法です。

var subject = new Subject<string>();
subject.OnNext("Value");
subject.OnCompleted();

購読方法は次のとおりです。

subject.SubscribeOn(Scheduler.CurrentThread);  // this is for thread safety, for instance
subject.Subscribe(() => { /* some action */ });

ああ、また、すべてスレッドセーフです!

于 2013-11-12T13:44:25.953 に答える