gpt4 book ai didi

带有异步/等待的ASP.NET Webforms

转载 作者:行者123 更新时间:2023-12-01 13:34:44 25 4
gpt4 key购买 nike

我的基于.Net 4.6的Webforms应用程序必须相当广泛地使用async/await-function。因为我对这个异步/等待主题还很陌生,所以我阅读了很多最佳实践,例如thisthis。但是我还有一些问题,我没有找到任何明确的信息。

  • 关于页面生命周期事件:我知道例如对于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事件之后仍会调用异步方法。但为什么?
  • 关于控制事件的
  • :最好像我在上面的代码示例中提到的那样注册异步方法,还是可以像下面这样使用async-void签名:
    protected async void OnClick(object sender, EventArgs e)
    {
    await SomeAsyncMethod();
    }

    我找到了两个示例,但没有明确的信息,这是更好的解决方案以及原因。
  • 关于上下文和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),这非常繁琐。我想知道这是否与我用于Web应用程序的Telerik对Ajax-Functionality的使用有关。但这只是一个假设。

    最佳答案

    ASP.NET WebForms具有自己的异步执行引擎。请引用the documentation

    无论如何,您通常都希望(或需要)回到诸如事件处理程序之类的方法上的当前同步上下文,因此您不应该在ConfigureAwait(false)内调用button1_Click,而应该在SomeAsyncMethod内调用它。

    关于带有异步/等待的ASP.NET Webforms,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44385376/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com