4

たくさんの関数がありますが、別の関数内で実行する必要があります。

私はこのようなことができることを知っています

public void Method1()
{
bla bla
}


public void Method2()
{
bla bla
}

public void Wrapper(Action<string> myMethod)
        {
        method{
            myMethod()
              }
            bla bla
         }

そして、次のようなものを使用してそれらを呼び出します。

wrapper(Method1());

問題は、Method1 と Method2 を同時に実行する必要がある場合があることです。彼らはたくさんいます。1つの場合もあれば、同時に複数の場合もあります。

だから私は、このようなことをするのは素晴らしいことだと思っています:

Wrapper({bla bla bla; method(); bla bla; }
{
method{
bla bla bla;
 method();
 bla bla;

        }
}

メソッド内でコード ブロックを実行します。メソッドのパラメーターはコード ブロックです。それは可能だと思いますか、それとも別のアプローチをお勧めしますか?

4

2 に答える 2

3

Action パラメーターを受け入れるメソッドが既にある場合は、匿名メソッドを使用して一連のメソッドをグループ化し、順次実行することができます。

//what you have
public void RunThatAction(Action TheAction)
{
  TheAction()
}

//how you call it
Action doManyThings = () =>
{
  DoThatThing();
  DoThatOtherThing();
}
RunThatAction(doManyThings);

メソッドを順番に呼び出すことがよくある場合は、できるだけ多くのアクションを受け入れる関数を作成することを検討してください...

public void RunTheseActions(params Action[] TheActions)
{
  foreach(Action theAction in TheActions)
  {
    theAction();
  }
}

//called by
RunTheseActions(ThisAction, ThatAction, TheOtherAction);

「同時に」と 2 回言ったので、並列処理を思い浮かべます。多くのメソッドを同時に実行したい場合は、タスクを使用して実行できます。

public void RunTheseActionsInParallel(params Action[] TheActions)
{
  List<Task> myTasks = new List<Task>(TheActions.Count);
  foreach(Action theAction in TheActions)
  {
    Task newTask = Task.Run(theAction);
    myTasks.Add(newTask);
  }
  foreach(Task theTask in myTasks)
  {
    theTask.Wait();
  }
}
于 2013-01-22T00:56:35.943 に答える
3

持つ

public static void Wrapper(Action<string> myMethod)
{
    //...
}

ラムダ式myMethodを使用して指定できます:

static void Main(string[] args)
{
    Wrapper((s) =>
    {
        //actually whatever here
        int a;
        bool b;
        //..
        Method1();
        Method2();
        //and so on
    });
}

つまり、目的のシグネチャ (ここでは と一致するAction<string>) を持つメソッドを明示的に定義する必要はありませんが、インライン ラムダ式を記述して、必要なことは何でも行うことができます。

MSDN から:

ラムダ式を使用すると、引数として渡すことができる、または関数呼び出しの値として返すことができるローカル関数を作成できます。

于 2013-01-22T00:25:03.690 に答える