13

私のcsharpアプリケーションには、特定のコードをループしている特定のスレッドで呼び出される関数をトリガーする特定のイベントがあります。

さて、このすべてのデータを手動で保存して大きなスイッチケースを使用する代わりに、これらの関数とそのパラメーターをリストに保存してから他のスレッドで処理できるかどうか疑問に思っていましたか?

擬似コード:

var func = pointer2somefunction(13, "abc");
list.add(func);

他のスレッド:

while (list.Count > 0)
{
     var func = list.Remove(0);
     func.Invoke();
}
4

2 に答える 2

18

はい、私の意見では、 aList<Action>または aを使用してこれを行うことができます。パラメーターなしの voidデリゲートの型です。Queue<Action>Action

var functions = new Queue<Action>();

functions.Enqueue(() => Console.WriteLine("Foo"));
functions.Enqueue(() => Console.WriteLine("Bar"));

while (functions.Any())
{
    // note the double parenthesis here: one for Dequeue
    // and one for your dequeued function
    functions.Dequeue()();
}

パラメータが必要な場合は、Action<T>for one、Action<T, T>for two などを使用します。戻り値については、Func代わりにAction(またはFunc<T>など) を使用します。

イベントも参考になるかも。イベントは、オブザーバー パターンを使用するための C# の言語機能です。

// events are usually on the instance rather than static
private static event EventHandler MyEvent;

static void Main(string[] args)
{
    MyEvent += (s, e) => Console.WriteLine("FooEvent");
    MyEvent += (s, e) => Console.WriteLine("BarEvent");
    MyEvent(null, EventArgs.Empty);
}

イベントはマルチキャスト デリゲートであり、関数のリストへのデリゲートです。ただし、各ハンドラーのスレッド化を制御することはできません。スレッドをQueue<Action>開始または再利用できる上記とは異なり、マルチキャスト デリゲートは外部からの1 つの呼び出しとして公開されるため、すべての呼び出しに対して 1 つのスレッドのみを使用できます。

于 2013-07-29T08:28:20.360 に答える
1

そのようにイベントを実装していると思います。大きなスイッチ ケースは必要ありません。いくつかのイベントが必要です。次に、適切なタイミングで適切なイベントをトリガーし、適切な方法で登録します。

デリゲートのリストを作成することはできますが、パラメーターのセットが異なる別の関数が必要な場合は複雑になります。

于 2013-07-29T08:31:01.513 に答える