我遇到了一个关于将新代码块注入动作委托的问题。
例如,我有一个这样的方法:
private void methodAsync(Action action)
{
new Task(action).Start();
}
我将此方法称为如下:
methodAsync(() =>
{
writeMessage("Task started");
//do some stuff
writeMessage("Task completed");
});
但是,我不想用很多writeMessages调用methodAsync。而不是我想打电话如下:
methodAsync(() =>
{
//do some stuff
});
因为在每个方法中我都会调用writeMessage,所以我可以在methodAsync中的所有动作委托中注入writeMessage,如下所示:
private void methodAsync(Action action)
{
//inject here
new Task(action).Start();
}
不幸的是,Action委托只有一些方法,比如invoke,begininvoke等,这些方法都无法解决我的问题。我不想按你的理解编写IL代码
答案 0 :(得分:1)
听起来你只是想要:
private void methodAsync(Action action)
{
new Task(() => {
writeMessage("Task started");
action();
writeMessage("Task completed");
}).Start();
}
换句话说,你没有改变动作 - 你只是在另一个动作中调用它。
作为替代方案,您可以使用委托合成:
private void methodAsync(Action action)
{
Action before = () => writeMessage("Task started");
Action after = () => writeMessage("Task completed");
new Task(before + action + after).Start();
}
对于“after”部分,另一种选择是在任务中添加 continuation 。除了其他任何东西,这将允许您记录任务是否失败。
(顺便说一下,您应该更改方法以遵循.NET命名约定。您可能还希望使用Task.Run
,并且可能从方法返回任务。)