将任务作为参数传递

本文关键字:参数传递 任务 | 更新日期: 2023-09-27 18:37:15

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

我有一个动作序列要执行多个

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

还有MethodB()MethodC()等,除了调用特定的异步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 绑定任务不需要的,应避免使用。

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

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

值得一提的是,不同的 IO 调用具有不同的方法签名。此外,任务只能在正文中开始执行Method()而不是之前执行。

将任务作为参数传递

当然,只需调用 func ,取回一个任务,然后await它:

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

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

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

所有这些调用都返回Task<Entity>就可以了。否则,您只能使用Task(这意味着启动操作并等待其完成),并且您将无法使用结果。