将任务作为参数传递
Passing a task as parameter
我不确定这是否可行,所以我出来了:
我有一个动作序列可以执行多个
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()
主体中开始执行,而不是之前。
当然,只需调用 func
,取回一个任务,然后 await
它:
async Task Method(Func<Task<Entity>> func)
{
// some code
var a = await func();
// some code
}
另外,当你发送那个 lambda 表达式时,因为它所做的只是调用一个 async
方法,它本身 return 是一个任务,它不需要是 async
本身:
Method(() => CallToIOBoundTask(params));
只要所有这些调用 return Task<Entity>
就可以了。如果没有,则只能使用Task
(即开始操作并等待其完成),结果将无法使用。
我不确定这是否可行,所以我出来了:
我有一个动作序列可以执行多个
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()
主体中开始执行,而不是之前。
当然,只需调用 func
,取回一个任务,然后 await
它:
async Task Method(Func<Task<Entity>> func)
{
// some code
var a = await func();
// some code
}
另外,当你发送那个 lambda 表达式时,因为它所做的只是调用一个 async
方法,它本身 return 是一个任务,它不需要是 async
本身:
Method(() => CallToIOBoundTask(params));
只要所有这些调用 return Task<Entity>
就可以了。如果没有,则只能使用Task
(即开始操作并等待其完成),结果将无法使用。