0

ワーカー スレッドをブロックすることなく、複数のワーカーから呼び出すことができるスレッド セーフなメソッドを作成したいと考えています。また、InvokeRequired->BeginInvoke タイプ コードが UI コントロール用であるのと同じように、コードを適切に簡潔にしたいと考えています... もちろんControl、この場合は a を使用していません。メソッドはカスタム クラスにあります。また、必ずしもすべてのメソッドでこれが必要なわけではありません。それで、これはカスタムクラス/メソッドで簡単に実装できるものですか?

須藤コード:

class foo
{
    //Fields
    Context MyContext;
    List<T> UnsafeList = new List<T>();

    //Method
    public void MyMethod(int someArg, Item someOtherArg)
    {
        if (!MyContext)
        {
            MyContext.BeginInvoke(...);
            return; //Calling thread returns
        }
        else
        {
            UnsafeList.Add(someOtherArg);
            return; //MyContext Thread returns
        }
    }

    //Constructor
    public foo()
    {
        MyContext = new GetSomeThreadHandle();
    }
}

カスタム EventArgs を使用してこれを行う方法については考えがあると思いますが、それにはほぼ反復的なコードが含まれており、より一般的でクリーンなソリューションを探していました。

編集

これはC#.Net 4.0を使用しています

4

2 に答える 2

3

とすれば:

  • .NET4を使用しています
  • リクエストのキューイングシリアル化についておっしゃいました...

...を介して、プロデューサー/コンシューマーキューが必要なようですBlockingCollection<T>。キューからプルする1つのスレッド(コンシューマー)を開始し、ワーカースレッドからキューに追加するだけです。

キューが予期しない/望ましくないレベルに達した場合に何をしたいのかを考える必要があります。(ブロックしたり、例外をスローしたり、リクエストをドロップしたりできます。)

編集:詳細については、このMSDNブログ投稿をBlockingCollection<T>参照してください。

于 2013-01-22T15:54:28.630 に答える
0

タスクに適用される生産者/消費者の方法を示す小さな例

public void produceConsume()
{
    var results = new BlockingCollection<double[]>();

    var producer = Task.Factory.StartNew(() =>
    {
        for (int i = 0; i < 100; i++)
        {
            var data = new double[1024];
            results.Add(data);                    
        }

        results.CompleteAdding();
    });

    var consumer = Task.Factory.StartNew(() =>
    {
        foreach (var item in results.GetConsumingEnumerable())
        {
           // put in chart
        }
    });

    producer.Wait();
}

また、複数の消費者がすべてのデータを消費する必要がある場合は、ConcurrentQueue を使用できます

于 2013-01-22T16:27:48.407 に答える