请原谅我,如果已经有一个覆盖这个的堆栈q,我找不到它。
我正在使用asp.net中的web api,它包含许多异步任务。我理解除了特定端点之外的大多数行为。这是我正在处理的一个例子:
public class Service {
public async Task ReadMessageAsync()
{
var messages = db.Messages.Where(/*some pred*/);
foreach (var m in messages)
{
m.isNew = false
}
db.SaveChanges();
return Task.FromResult(0);
}
}
// in api controller
public async Task<IHttpActionResult> GetMessages(bool onlyNew)
{
var messages = service.GetMessages(onlyNew); // this is defined in service class
await service.ReadMessageAsync(); // async call to mark new messages as not new
return Ok(messages);
}
我的一些问题与几种不同场景下的异步调用有关:
Task
更改为void
?我对不同用例的其他行为非常熟悉,但这些都不清楚。任何可以在这上面散发的光都会非常感激。谢谢!
答案 0 :(得分:4)
按顺序:
异步调用不会阻止被调用者返回。如果在被调用者中使用await
,则被调用者将控制权返回给调度程序,并且该方法的其余部分将作为延续符号进行注册,该延续将在await
编辑{{1}后运行已完成(或抛出异常)。
是的 - 但您无法Task
await
异步方法。这通常适用于事件监听器,但我不会在其他地方推荐它。
毫无头绪。希望其他人可以回答这个问题。鉴于void
将方法的其余部分作为继续进行注册,可以假设如果调用Task的线程被中止,则继续也是如此。但是我在这里说我的屁股。