我正在实现一个方法,Task<Result> StartSomeTask()并且在调用方法之前就已经知道了结果.如何创建已完成的Task <T>?
这就是我目前正在做的事情:
private readonly Result theResult = new Result();
public override Task<Result> StartSomeTask()
{
var task = new Task<Result>(() => theResult);
task.RunSynchronously(CurrentThreadTaskScheduler.CurrentThread);
return task;
}
Run Code Online (Sandbox Code Playgroud)
有更好的解决方案吗?
假设我想发出并行 API post 请求。
在 for 循环中,我可以将 http post 调用附加到任务列表中(使用 Task.Run 调用的每个任务),然后等待所有任务完成使用await Task.WhenAll. 因此,在等待网络请求完成时,控制权将交给调用者。实际上,API 请求将并行发出。
同样,我可以使用Parallel.ForEachAsync它将自动执行WhenAll并将控制权返回给调用者。所以我想问是否ForEachAsync可以替换普通的 for 循环列表(async wait Task.Run)和WhenAll?
我正在创建 ASP.NET Web API,其中某些操作(同步、遗留代码)可能需要一些时间(主要是 IO 限制,但也有一些计算密集型的东西)。
我知道每个传入请求都从线程池中分配了一个线程,但我对其余部分有点模糊。请求线程是否以某种方式“特殊”,保证将工作卸载到其他线程以避免锁定它?卸载对线程池饥饿和拒绝请求有帮助吗?如果是这样,我是否需要一直为每个可能长时间运行的函数创建一个异步包装器,还是只需要一个最高级别的异步包装器?
我已经制作了一些代码来实现一些Web API.此API方法返回Foo Table的最后一条记录.
public class FooController : ApiController
{
private FooContext db = new FooContext();
// GET: api/Foo
[ResponseType(typeof(Foo))]
public async Task<IHttpActionResult> GetLastFoo()
{
Foo foo = await db.Foo.Last();
if (foo == null)
{
return NotFound();
}
return Ok(foo);
}
}
Run Code Online (Sandbox Code Playgroud)
我想让这个API异步,但没有LastAsync()方法.为什么以及如何解决它?提前致谢.