0

BlockingCollection<T>生産者/消費者シナリオでを消費する方法の例をたくさん見てきましたが、ここでは一度に1つの要素を消費する方法もあります。しかし、私は並列プログラミングにまったく慣れていないので、次の問題に直面しています。

実際、問題は、配列内のすべての要素に対して最初の2つを消費し、次に配列内のすべての要素に対して次の2つを消費するように、以下の例のメソッドをどのように記述するかConsumerProducerExample.ConsumerMethodです。doubleBlockingCollection<Double>double

以下の例でメソッドを記述しましたが、それは私が望む方法ではありません。それは私が上でリンクした例に基づいて行う方法を私が知っていることです。これは正反対の方法です。ここにあるように、配列doubleの次の配列にジャンプする前にすべてを消費しBlockingCollection<Double>ます。そして、繰り返しますが、2つだけを消費しdouble、次にジャンプして2つをBlockingCollection<Double>消費するdoubleなどです。配列ループが完了した後、要素doubleごとに次の2つをBlockingCollection<Double>再び消費します。

public class ConsumerProducerExample
{
    public static BlockingCollection<Double>[] data;
    public static Int32 nEl = 100;
    public static Int32 tTotal = 1000;
    public static Int32 peakCounter = 0;

    public static void InitData()
    {
        data = new BlockingCollection<Double>[nEl];
        for (int i = 0; i < nEl; i++) data[i] = new BlockingCollection<Double>();
    }

    public static void ProducerMethod()
    {
        Int32 t = 0, j;
        while (t < ConsumerProducerExample.tTotal)
        {
            j = 0;
            while (j < ConsumerProducerExample.nEl)
            {
                data[j].Add(Math.Sin((Double)t / 10.0D));
                j++;
            }
            t++;
        }
        j = 0;
        while (j < ConsumerProducerExample.nEl)
        {
            data[j].CompleteAdding();
            j++;
        }
    }

    public static void ConsumerMethod()
    {
        // THE PROBLEM IS WITH THIS METHOD

        Double x1, x2;
        Int32 j = 0;
        while (j < Program.nEl)
        {
            while (!data[j].IsCompleted)
            {
                try
                {
                    x1 = data[j].Take();
                    x2 = data[j].Take();
                }
                catch (InvalidOperationException)
                {
                    break;
                }

                if (x1 * x2 < 0.0)
                {
                    Program.peakCounter++;
                }
            }

            j++;
        }
    }
}

これらは次のように使用する必要があります。

ConsumerProducerExample.InitData();
Task task1 = Task.Factory.StartNew(ConsumerProducerExample.ProducerMethod);
Task task2 = Task.Factory.StartNew(ConsumerProducerExample.ConsumerMethod);

助言がありますか?

要するに、これはnEl微分方程式の解のピークを同時に数える試みです(解はこの例ではで表されsin(x)ます)。

4

1 に答える 1