异步方法应该有什么样的行为?

时间:2015-07-08 17:21:41

标签: c# asp.net .net multithreading asynchronous

请原谅我,如果已经有一个覆盖这个的堆栈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);
}

我的一些问题与几种不同场景下的异步调用有关:

  • 异步调用是否会阻止调用方法返回,直到async因等待而结束?
  • 将返回类型从Task更改为void
  • 是否安全?
  • 当调用线程终止时,异步调用会发生什么(在请求将响应发送回客户端并关闭线程的实例中)?

我对不同用例的其他行为非常熟悉,但这些都不清楚。任何可以在这上面散发的光都会非常感激。谢谢!

1 个答案:

答案 0 :(得分:4)

按顺序:

  • 异步调用是否会阻止调用方法返回,直到async因等待而结束?

异步调用不会阻止被调用者返回。如果在被调用者中使用await,则被调用者将控制权返回给调度程序,并且该方法的其余部分将作为延续符号进行注册,该延续将在await编辑{{1}后运行已完成(或抛出异常)。

  • 将返回类型从Task更改为void是否安全?

是的 - 但您无法Task await异步方法。这通常适用于事件监听器,但我不会在其他地方推荐它。

  • 当调用线程终止时,异步调用会发生什么(在请求将响应发送回客户端并关闭线程的实例中)?

毫无头绪。希望其他人可以回答这个问题。鉴于void将方法的其余部分作为继续进行注册,可以假设如果调用Task的线程被中止,则继续也是如此。但是我在这里说我的屁股。