编程语言
首页 > 编程语言> > 如何在C#4.5中将同步4.0转换为异步

如何在C#4.5中将同步4.0转换为异步

作者:互联网

我很难用HttpClient将下面在4.0中创建的代码转换为4.5.

根据我的理解,如果我使用异步请求,我是否应该在GUI线程本身中创建多个Web请求而不阻塞GUI.

如何在4.5中使用HttpClient将以下代码转换为异步

// This is what called when button is clicked

Task t3 = new Task(SpawnTask);
t3.Start();


//if noofthreads are less 50 then GUI is woking fine.. if number increases then takes much time for repaint.. 
//where as other softwares are working without any problem even if the threads are more     than 500!! in  the same system 
public void SpawnTask()
{
    try
    {
         ParallelOptions po = new ParallelOptions();
         po.CancellationToken = cts.Token;
         po.MaxDegreeOfParallelism = noofthreads;
         Parallel.ForEach(
         urls,
         po,
         url => checkpl(url));
     }
     catch (Exception ex)
     {

     }

 }


  public void checkpl(string url)
  {
     try
     {
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
         request.Timeout = 60*1000;
         HttpWebResponse response = (HttpWebResponse)request.GetResponse();
         string stext = "";
         using (BufferedStream buffer = new BufferedStream(response.GetResponseStream()))
          {
            using (StreamReader reader = new StreamReader(buffer))
            {
                stext = reader.ReadToEnd();
            }
      }
      response.Close();
   if (stext .IndexOf("domainname.com") != -1)
      {
          tfound = tfound  + 1;
          string lext = "Total Found : "+tfound.ToString();
          label3.BeginInvoke(new InvokeDelegate(UpdateLabel), ltext);
          slist.Add(url);

          textBox2.BeginInvoke(new InvokeDelegate4(UpdateText), "Working Url " + url);

      }
 }
    catch (Exception ex)
    {       
    }
 }

解决方法:

由于使用的是.NET 4.5,因此可以使用新的async和await关键字.这是可能的样子.

private async void YourButton_Click(object sender, EventArgs args)
{
    YourButton.Enabled = false;
    try
    {
      var tasks = new List<Task>();
      foreach (string url in Urls)
      {
        tasks.Add(CheckAsync(url));
      }
      await TaskEx.WhenAll(tasks);
    }
    finally
    {
      YourButton.Enabled = true;
    }
}

private async Task CheckAsync(string url)
{
    bool found = await UrlResponseContainsAsync(url, "domainname.com");
    if (found)
    {
        slist.Add(url);
        label3.Text = "Total Found: " + slist.Count.ToString();
        textbox2.Text = "Working Url " + url;
    }
}

private async Task<bool> UrlResponseContainsAsync(string url, string find)
{
    var request = WebRequest.Create(url);
    request.Timeout = 60 * 1000;
    using (WebResponse response = await request.GetResponseAsync())
    {
        using (var buffer = new BufferedStream(response.GetResponseStream()))
        using (var reader = new StreamReader(buffer))
        {
            string text = reader.ReadToEnd();
            return text.Contains(find);
        }
    }
}

标签:multithreading,asynchronous,async-await,c
来源: https://codeday.me/bug/20191122/2061669.html