我正在研究一些使用ASP.NET 4.7.2的.NET Web代码。
下面是一个示例控制器和操作方法:
public class ThingController : System.Web.Http.ApiController
{
// ...
public async Task<IHttpActionResult> GetValue()
{
var value = await _db.GetValue().ConfigureAwait(false);
return Content(value);
跟进。我有一个包含许多异步方法的库,这些方法可以很细地包装。实际上,他们只需做一些设置,并直接返回从Task调用返回的HttpClient:
public Task DoThingAsyc() {
// do some setup
return httpClient.DoThingAsync();
}
我正在考虑是否在这些调用中添加ConfigureAwait(false)。流行的观点似乎是“是的,总是在图书馆这样做”。但是在这种情况下,它会引入一些(可能可以忽略的)开销,因为ConfigureAwait返回一个ConfiguredTaskAwaitable,为了不更改方法签名
我想更快地读取大容量音频文件的标签。目前,我可以存储5000个音频文件信息的结构列表在大约7秒。
问题是当我选择有20,000或40,000个文件的文件夹时,应用程序继续运行,并且不通知进程已经完成。而当它读取5,000个文件时,它会显示消息框,在7秒内提示“完成加载文件5000”。
这是我的代码:
public struct SongInfoStruct
{
public string Key;
public string Value;
public string Artist;
如果您有服务器端代码(例如,一些ApiController),而您的函数是异步的-因此它们返回Task<SomeObject> -那么在任何时候等待您调用ConfigureAwait(false)的函数都是最佳实践吗
我读到它的性能更高,因为它不需要将线程上下文切换回原始线程上下文。然而,在ASP.NET Web中,如果您的请求来自一个线程,而您等待某个函数并调用ConfigureAwait(false),那么当您返回ApiController函数的最终结果时,可能会将您置于另一个线程上。
我已经输入了下面要讨论的一个示例:
public class CustomerControl
我已经阅读了很多关于异步/等待编程模型的文章,但是仍然有一些不太清楚的地方,我想分享一下我对这些模型的困惑。
假设我们有以下配置:
主要的异步方法是public async Task<bool> DoSomethingBigAsync(){...},它内部有三个其他方法,如下所示:
( A) var a = await _someInstance.DoSomethingLittle_A_Async().ConfigureAwait(false);
( B) var b = await _someInstance.DoSomethingLittle_B_Async();
( C) v
基于包括在内的众多书籍和博客,很明显,当您编写一个dll库,公开助手异步方法(即包装器方法)时,通常认为最好的做法是在线程池线程上内部完成实际异步方法的I/O任务(下面显示的伪代码是简洁的,我正在使用HttpClient作为示例)。
public Async Task<HttpResponseMessage> MyMethodAsync(..)
{
...
var httpClient = new HttpClient(..);
var response = await httpClient.PostAsJsonAsync(..).ConfigureAwai
请考虑下面的windows窗体代码:
private async void UpdateUIControlClicked(object sender, EventArgs e)
{
this.txtUIControl.Text = "I will be updated after await - i hope!";
await Task.Delay(5000).ConfigureAwait(continueOnCapturedContext: false);
this.txtUIControl.Text = "I am updated now.&
我以为我掌握了ConfigureAwait,然后我尝试了一个实验。
我的理解是,只有在存在同步上下文的情况下,ConfigureAwait(false)才会起作用。
ASP、WPF等应该有上下文,但控制台应用程序和服务应用程序不应该。
为了了解它是如何工作的,我制作了一个Web应用程序,并包括以下方法:
// GET api/values/5
public async Task<string> Get (int id)
{
var syncCtx = SynchronizationContext.Current;
int startThreadId = Threa
当我签到的时候,默默地得到一个记号:
var accounts = await this.PublicClientApplication.GetAccountsAsync().ConfigureAwait(false);
foreach (IAccount account in accounts)
{
var authenticationResult = await this.PublicClientApplication.AcquireTokenSilent(this.Scopes, ac
我正在尝试使用HttpClient执行一个简单的post请求(据我所知,这是当前处理post请求的正确方法)。然而,代码在timeoutTask.Result上停滞,任务在Status=WaitingForActivation上停滞不前。从服务器端来看,我知道post请求正在发送,数据正在返回,我还手动调用了wget,并验证了此post请求从服务器返回的某些文本数据是否正确。
当我简单地调用task.Result时就会发生这种情况,所以我试图添加一个超时任务,但我一定是在使用异步时犯了一些错误,因为它仍然挂在timeoutTask.Result上。
class HttpPostExample
我知道建议在库代码中对await使用ConfigureAwait(false),这样后续代码就不会在调用者的执行上下文中运行,而执行上下文可能是UI线程。出于同样的原因,我也理解应该使用await Task.Run(CpuBoundWork)而不是CpuBoundWork()。
使用ConfigureAwait的示例
public async Task<HtmlDocument> LoadPage(Uri address)
{
using (var client = new HttpClient())
using (var httpResponse = await