Gor*_*ran 14 .net c# task-parallel-library async-await .net-4.5
我不确定这是否可行,所以我在这里:
我有一系列动作来执行多个
async Task MethodA(...)
{
// some code
// a call to specific Async IO bound method
// some code
}
Run Code Online (Sandbox Code Playgroud)
还有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);
Run Code Online (Sandbox Code Playgroud)
但是,此代码每次都会提取一个新线程,这对于IO绑定任务不是必需的,应该避免使用.
那么,有没有办法重构代码,以便不使用ThreadPool线程?目标是拥有这样的代码:
private async Task Method(Task<Entity> task)
{
// some code
var a = await task;
// some code
}
Run Code Online (Sandbox Code Playgroud)
同样重要的是要提到不同的IO调用具有不同的方法签名.此外,任务可以开始仅在Method()正文中执行,而不是之前执行.
i3a*_*non 23
当然,只需调用func,获取任务,然后await:
async Task Method(Func<Task<Entity>> func)
{
// some code
var a = await func();
// some code
}
Run Code Online (Sandbox Code Playgroud)
此外,当您发送该lambda表达式时,由于它所做的只是调用一个async本身返回任务的方法,因此它本身并不需要async:
Method(() => CallToIOBoundTask(params));
Run Code Online (Sandbox Code Playgroud)
只要所有这些调用都返回,那就没问题Task<Entity>.如果没有,您只能使用Task(这意味着启动操作并等待其完成),您将无法使用结果.
| 归档时间: |
|
| 查看次数: |
9242 次 |
| 最近记录: |