1
            var tasks0 = new BlockingCollection<object>(new ConcurrentQueue<object>());
            tasks0.Add(Fetch(APCounter));
            tasks0.Add(Decode(APCounter));
            tasks0.Add(ALURes(APCounter));
            tasks0.Add(Memory(APCounter));
            tasks0.Add(WriteB(APCounter));


            var tasks1 = new BlockingCollection<object>(new ConcurrentQueue<object>());
            tasks1.Add(Fetch(APCounter+1));
            tasks1.Add(Decode(APCounter + 1));
            tasks1.Add(ALURes(APCounter + 1));
            tasks1.Add(Memory(APCounter + 1));
            tasks1.Add(WriteB(APCounter + 1));

現在追加されている関数を実行したくありません。後でビジネスロジックを使用して手動で行います。!!!

4

3 に答える 3

1

他の人が言っているように、あなたはあなたが望むことをするために、代表者のリスト、または同様のものを保存する必要があるでしょう。これらの関数を実行してから、結果をブロッキングコレクションに保存します。最初に行う必要があるのは、ブロッキングコレクションのジェネリック型を次のように変更することです。

//add tasks
//if the functions return a common object other than "object" then adjust this accordingly
var tasks0 = new BlockingCollection<Func<object>>();//defaults to using a ConcurrentQueue
tasks0.Add(()=>Fetch(APCounter));
tasks0.Add(()=>Decode(APCounter));
tasks0.Add(()=>ALURes(APCounter));
tasks0.Add(()=>Memory(APCounter));
tasks0.Add()=>(WriteB(APCounter));

次に、実際に関数を実行するには:

//run tasks
object firstResult = tasks0.Take()();
object secondResult = tasks0.Take()();
//...
于 2012-05-01T18:05:19.177 に答える
1

関数のリストをキューに保存したい質問を正しく理解できれば、それは後で呼び出されます。この場合、必要なものは次のとおりです。

tasks0.Add(() => Fetch(APCounter)); 
tasks0.Add(() => Decode(APCounter)); 

など - なぜなら

tasks0.Add(Fetch(APCounter)); 

への呼び出しの結果を追加しますがFetch(APCounter)

tasks0.Add(() => Fetch(APCounter)); 

委任呼び出しを追加しますFetch(APCounter)

于 2012-05-01T17:37:23.727 に答える
1

メソッドをリストに追加しようとしているのであれば、メソッドをリストに追加していません。のようなメソッドを呼び出しFetch(APCounter)て、そのメソッドの結果をBlockingCollection.

代わりに、デリゲートを作成し、デリゲートをコレクションに追加してみてください。

public delegate FetchFunction(int apCounter);
tasks0.Add(FetchFunction(APCounter);

// or using lambda expressions
tasks0.Add(() => Fetch(APCounter));
于 2012-05-01T17:39:26.613 に答える