当您拥有服务器端代码(即某些代码ApiController
)并且您的函数是异步的(因此它们返回)Task<SomeObject>
时,是否在任何时候都等待调用的函数是否被视为最佳实践ConfigureAwait(false)
?
我已经读到它具有更高的性能,因为它不必将线程上下文切换回原始线程上下文。但是,对于ASP.NET Web Api,如果您的请求是在一个线程上传入的,并且您等待某个函数并调用ConfigureAwait(false)
,则在返回ApiController
函数的最终结果时,该函数可能会将您置于另一个线程上。
我在下面输入了一个我正在谈论的例子:
public class CustomerController : ApiController
{
public async Task<Customer> Get(int id)
{
// you are on a particular thread here
var customer = await SomeAsyncFunctionThatGetsCustomer(id).ConfigureAwait(false);
// now you are on a different thread! will that cause problems?
return customer;
}
}
HttpContext.Current
由ASP.NETSynchronizationContext
进行流传输,默认情况下,ASP.NET会在您进行流传输await
,但是不会由ContinueWith
。OTOH,执行上下文(包括安全性限制)是通过C#在CLR中提到的情况下,它是由两个流ContinueWith
和await
(即使你使用ConfigureAwait(false)
)。