动态添加新代码块到.Net中的操作委派

时间:2013-11-27 07:48:38

标签: .net asynchronous delegates

我遇到了一个关于将新代码块注入动作委托的问题。

例如,我有一个这样的方法:

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代码

1 个答案:

答案 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,并且可能从方法返回任务。)