将任务作为参数传递

时间:2015-01-13 08:49:31

标签: c# .net task-parallel-library async-await .net-4.5

我不确定这是否可行,所以我在这里:

我有一系列动作来执行多个

async Task MethodA(...)
{
    // some code
    // a call to specific Async IO bound method
    // some code
}

还有MethodB()MethodC()等,除了对特定Async IO绑定方法的调用之外,所有代码都具有完全相同的代码。我试图找到一种方法将任务指针传递给方法,以便我们稍后可以在Method()中执行它。

我目前正在做的是:

private async Task Method(Func<Task<Entity>> func)
{
    // some code
    var a = await task.Run(func);
    // some code
}

var task = async () => await CallToIOBoundTask(params);
Method(task);

但是,这段代码每次都会拉出一个新的线程,这对IO绑定任务来说是不必要的,应该避免使用。

那么,有没有办法重构代码,以便不使用ThreadPool线程?目标是拥有这样的代码:

private async Task Method(Task<Entity> task)
{
    // some code
    var a = await task;
    // some code
}

同样重要的是要提到不同的IO调用具有不同的方法签名。此外,任务可以仅在Method()正文中开始执行,而不是之前执行。

1 个答案:

答案 0 :(得分:20)

当然,只需调用func,找回任务,然后await

async Task Method(Func<Task<Entity>> func)
{
    // some code
    var a = await func();
    // some code
}

此外,当您发送该lambda表达式时,由于它所做的只是调用async方法,该方法本身返回一个任务,因此它本身不需要async:< / p>

Method(() => CallToIOBoundTask(params));

只要所有这些调用都返回Task<Entity>,那就没问题。如果没有,您只能使用Task(这意味着启动操作并等待其完成),您将无法使用该结果。