C# 忽略异步而不等待编译警告
我有一个具有以下抽象方法的基本控制器:C# 忽略异步而不等待编译警告,c#,visual-studio-2012,asp.net-web-api,async-await,task-parallel-library,C#,Visual Studio 2012,Asp.net Web Api,Async Await,Task Parallel Library,我有一个具有以下抽象方法的基本控制器: [HttpDelete] public abstract Task<IHttpActionResult> Delete(int id); 这将删除警告。然而,有更好的解决办法吗 除了忽略上述警告之外,还有更好的选择吗 (即更改上述代码)以避免出现此警告 另一种方法是删除async修饰符并使用Task.FromResult返回任务: 公共覆盖任务删除(int-id) { 返回Task.FromResult( ResponseMessage(Re
[HttpDelete]
public abstract Task<IHttpActionResult> Delete(int id);
这将删除警告。然而,有更好的解决办法吗
除了忽略上述警告之外,还有更好的选择吗
(即更改上述代码)以避免出现此警告
另一种方法是删除async
修饰符并使用Task.FromResult
返回任务
:
公共覆盖任务删除(int-id)
{
返回Task.FromResult(
ResponseMessage(Request.CreateResponse(
HttpStatusCode.MethodNotAllowed,
新的NotSupportedException());
}
关于完全删除异步
通常是删除警告的首选方式,另一个不会降低性能的正确答案是等待已完成的任务
await
大致翻译为检查等待的任务是否已完成,如果已完成,则继续同步执行方法的其余部分,如果未完成,则将其余部分添加为该任务的继续部分
private static readonly Task _completedTask = Task.FromResult(false);
public override async Task<IHttpActionResult> Delete(int id)
{
await _completedTask;
return ResponseMessage(Request.CreateResponse(HttpStatusCode.MethodNotAllowed, new NotSupportedException()));
}
private static readonly Task\u completedTask=Task.FromResult(false);
公共覆盖异步任务删除(int-id)
{
等待完成任务;
返回响应消息(Request.CreateResponse(HttpStatusCode.MethodNotAllowed,newnotsupportedexception());
}
在.Net 4.6中,您可以使用新的Task.CompletedTask
属性,而不是创建自己的已完成任务
这使您能够保持方法
异步
,并与之保持一致。如果您不希望允许删除操作,为什么要从中派生?根据上述答案,我遇到以下异常:无法将类型“System.Threading.Tasks.Task”隐式转换为“System.Threading.Tasks.Task”
@Ivan MarkDebono将代码更改为Task.FromResult(ResponseMessage(…)然后创建一个隐藏类的新对象,调用使用缓存完成的任务的方法,然后对该对象进行垃圾收集。我不是说方法正在等待的任务,我是说它返回的任务。同样,这不是一个严重的问题,但也不是说它“不会降低性能”。@JonHanna所有选项都必须返回一个新任务。@JonHanna但是如果您引用的是由async方法生成的状态机,那么它也会在原始代码中生成,因此没有degradation@JonHanna此外该状态机是一个结构,只有在您真正挂起该方法时才会移动到堆,而在等待的任务完成时不会发生这种情况。所以没有分配,没有收集,也没有降级。你是对的,没有分配。尽管如此,仍有比Yuval的答案更多的工作要做,除非所涉及的方法内联。
return await Task.Run(() => ResponseMessage(Request.CreateResponse(HttpStatusCode.MethodNotAllowed, new NotSupportedException())));
public override Task<IHttpActionResult> Delete(int id)
{
return Task.FromResult<IHttpActionResult>(
ResponseMessage(Request.CreateResponse(
HttpStatusCode.MethodNotAllowed,
new NotSupportedException())));
}
private static readonly Task _completedTask = Task.FromResult(false);
public override async Task<IHttpActionResult> Delete(int id)
{
await _completedTask;
return ResponseMessage(Request.CreateResponse(HttpStatusCode.MethodNotAllowed, new NotSupportedException()));
}