How to use async/await to achieve asynchronous page in asp.net webform?

后端 未结 2 1235
栀梦
栀梦 2020-12-30 04:13

We can now use the async/await key words in ASP.NET MVC 4.

public async Task TestAsync()
{
    Web         


        
相关标签:
2条回答
  • 2020-12-30 05:05

    One easy way is to just make your event handlers async. First, add the Async="true" parameter to the @Page directive, and then you should be able to write async event handlers as such:

    protected async void Page_Load(object sender, EventArgs e)
    {
      var client = new WebClient();
      var content = await client.DownloadStringTaskAsync("http://www.google.com");
      Response.Write(content);
    }
    

    I say "should be able to" because I haven't actually tried this out myself. But it should work.

    Update: This does not work for Page_Load (see this MSDN forum thread), but should work for other events such as button clicks.

    Update: This does work for Page_Load in ASP.NET 4.5. Also, they added checks if you improperly use an async event handler. See this video for details.

    0 讨论(0)
  • 2020-12-30 05:13

    According to http://www.hanselman.com/blog/TheMagicOfUsingAsynchronousMethodsInASPNET45PlusAnImportantGotcha.aspx the only reliable way to use async in web forms is to call Page.RegisterAsyncTask.

    The code to support simple things like async Page_Load is extremely complicated and not well-tested for anything beyond basic scenarios.

    Using async with voids is not stable or reliable. However, all you have to do is call Page.RegisterAyncTask - it's not any trouble and you'll be in a better more flexible place

    .

    public void Page_Load(object sender, EventArgs e)
    {
        RegisterAsyncTask(new PageAsyncTask(LoadSomeData));
    }
    
    public async Task LoadSomeData()
    {
    var clientcontacts = Client.DownloadStringTaskAsync("api/contacts");
    var clienttemperature = Client.DownloadStringTaskAsync("api/temperature");
    
    var contacts = Newtonsoft.Json.JsonConvert.DeserializeObject>(await clientcontacts);
    var temperature = Newtonsoft.Json.JsonConvert.DeserializeObject(await clienttemperature);
    
    listcontacts.DataSource = contacts;
    listcontacts.DataBind();
    Temparature.Text = temperature; 
    }
    
    0 讨论(0)
提交回复
热议问题