【发布时间】:2017-11-07 04:43:45
【问题描述】:
我基于 .Net 4.6 的 Webforms 应用程序必须非常广泛地使用 async/await 功能。因为我对这个 async/await 主题很陌生,所以我阅读了很多最佳实践,例如 this 或 this。但是我还有一些问题没有找到明确的信息。
-
关于页面生命周期事件:我知道,例如对于 Page_Load-Event,最好的做法是避免使用异步 void 方法并注册这样的方法:
protected void Page_Load(object sender, EventArgs e) { PageAsyncTask pageAsyncTask = new PageAsyncTask(SomeAsyncMethod); Page.RegisterAsyncTask(pageAsyncTask); //Method to invoke the registered async-methods immedietly and not after the PreRender-Event Page.ExecuteRegisteredAsyncTasks(); }我的问题是我想在注册后立即调用异步方法,而不是在 OnPreRender 事件之后。这应该通过调用 ExecuteRegisteredAsyncTasks() 方法来实现。但在我的情况下,这 没有效果,并且在 PreRender 事件之后仍会调用异步方法。但是为什么呢?
-
关于 Control-Events:是用我在上面的代码示例中提到的相同方式注册 async-methods 更好,还是可以使用 async-void 签名,例如:
protected async void OnClick(object sender, EventArgs e) { await SomeAsyncMethod(); }我找到了这两个示例,但没有明确的信息哪个是更好的解决方案以及原因。
-
关于 Context 和 ConfigureAwait,最好的做法是使用
await SomeAsyncMethod.ConfigureAwait(false)以获得更好的性能,并且在上下文不重要的情况下不要使用它,例如在上下文中使用它。操作 GUI 元素时。但就我而言,如果我在点击事件中调用await SomeAsyncMethod.ConfigureAwait(false)似乎没有什么区别。我仍然可以毫无问题地操作我的 GUI 元素。我使用的示例是这样的:private async void button1_Click(object sender, EventArgs e) { button1.Enabled = false; try { await SomeAsyncMethod().ConfigureAwait(false); } finally { //Manipulating still works even it's another context button1.Enabled = true; } }
所以我想知道为什么 GUI 元素的操作仍然有效,以及我是否真的应该在上下文不重要的每个异步方法上使用 ConfigureAwait(false),这非常乏味。我想知道这是否与 Telerik 用于我的 Web 应用程序的 Ajax-Functionality 的使用有关。但这只是一个假设。
【问题讨论】:
-
如果您想以 Markdown 格式呈现列表中的代码块,请使用双缩进。
-
好的,感谢编辑。
-
ASP.NET 应用程序中没有 GUI。 WebForms 为您提供了一个看起来 像 GUI 的模型,但实际上并非如此。也就是说,当该方法必须调用 ASP.NET API(例如
button1.Enabled)时,我不会调用ConfigureAwait(false)。大多数 API 都可以正常工作,但也有一些会失败,所以我只是谨慎行事。
标签: asp.net asynchronous webforms async-await