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。他们很多。有时一个,有时几个同时。

所以我认为做这样的事情会很棒:

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

        }
}

在方法内部运行一个代码块,方法的参数就是代码块。你认为有可能还是你会推荐另一种方法?

4

2 回答 2

3

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

您可以myMethod使用lambda 表达式指定:

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

也就是说,您不需要显式定义具有所需签名的方法(此处为匹配Action<string>),但您可以编写内联 lambda 表达式,做任何您需要的事情。

来自 MSDN:

通过使用 lambda 表达式,您可以编写可以作为参数传递或作为函数调用的值返回的局部函数。

于 2013-01-22T00:25:03.690 回答
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);

你说了两次“同时”,这让我想到了并行性。如果您想同时运行多个方法,可以使用 Tasks 来执行此操作。

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 回答