我有很多功能,但我确实需要在另一个功能中运行它们。
我知道我可以做这样的事情
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;
}
}
在方法内运行代码块,方法的参数是代码块。 你认为是否有可能或者你会推荐另一种方法吗?
答案 0 :(得分:3)
具有
public static void Wrapper(Action<string> myMethod)
{
//...
}
您可以使用lambda expression指定myMethod
:
static void Main(string[] args)
{
Wrapper((s) =>
{
//actually whatever here
int a;
bool b;
//..
Method1();
Method2();
//and so on
});
}
那就是你不需要显式定义一个带有所需签名的方法(这里匹配Action<string>
),但是你可以编写内联lambda表达式,无论你需要什么。
来自MSDN:
通过使用lambda表达式,您可以编写可以的本地函数 作为参数传递或作为函数调用的值返回。
答案 1 :(得分:2)
如果您已经有一些接受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);
你说“同时”两次,这让我想到了并行性。如果要同时运行多个方法,可以使用“任务”来执行此操作。
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();
}
}