[英]ASP.NET Webforms with async/await
我的基于.Net 4.6的Webforms应用程序必须非常广泛地使用async / await-functions。 因为我对这个async / await主题很陌生,所以我读了很多像这样或者这样的最佳实践。 但我还有一些问题,我没有找到任何明确的信息。
关于Page-Lifecycle-Events:我知道例如对于Page_Load-Event,最好的做法是避免异步void-methods并注册这样的方法:
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(); }
我的问题是我想在注册后立即调用async-method,而不是在OnPreRender事件之后调用。 这应该通过调用ExecuteRegisteredAsyncTasks() - 方法来实现。 但在我的情况下,这没有任何效果,并且在PreRender事件之后仍然会调用async-method。 但为什么?
关于Control-Events:以上面的代码示例中提到的方式注册异步方法更好,还是可以使用async-void签名:
protected async void OnClick(object sender, EventArgs e) { await SomeAsyncMethod(); }
我找到了两个例子,但没有明确的信息,这是更好的解决方案和原因。
关于Context和ConfigureAwait,似乎最佳做法是使用await SomeAsyncMethod.ConfigureAwait(false)
以获得更好的性能,并且上下文不重要,而不是在上下文中使用它,例如在操作GUI元素时。 但在我的情况下,如果我在click事件中调用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),这非常繁琐。 我想知道这是否与我用于Web应用程序的Telerik使用Ajax功能有关。 但这只是一个假设。
ASP.NET WebForms拥有自己的异步执行引擎。 请参阅文档 。
在任何情况下,您通常希望(或需要)返回事件处理程序等方法的当前同步上下文,因此不应在button1_Click
内调用ConfigureAwait(false)
,但应在SomeAsyncMethod
调用它。
我对Asp.net 4.5 webforms的简单方法:
1)使用此属性声明aspx页面
<%@ Page ..... Async="true" ValidateRequest="false" EnableEventValidation="false" %>
2)在代码中创建这个void方法:
void MyAsyncMethod( ... list parameters )
{
//Insert this on end method code
var objThread = Session["MyAsyncMethod"] as Thread;
if (objThread != null) objThread.Abort();
}
3)调用方法MyAsyncMethod:
var objThread = new Thread(
() => MyAsyncMethod(parameters..)) {IsBackground = true};
objThread.Start();
Session["MyAsyncMethod"] = objThread;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.