如果我从HttpWebRequest和HttpWebResponse发出请求和响应,GUI会挂起

时间:2015-06-27 14:57:44

标签: c# multithreading user-interface backgroundworker

我有一个ac #win forms程序来检查URL是否存在。程序工作正常但是当我用按钮启动过程时单击gui挂起直到检查完成。我基本上按下一个按钮执行下面的代码。请帮助我如何实现后台工作或其他线程处理,以便我可以访问我的GUI。

//这是我点击的按钮然后我的GUI挂起(不可访问),直到两个函数都执行。

 private void button2_Click(object sender, EventArgs e)   
            {
                performfetch();      
            }

    public void performfetch()
            {
                button2.Enabled = false;
                button1.Enabled = false;
                button2.Visible = false;
                button1.Visible = false;
                progressBar1.Minimum = 0;
                progressBar1.Maximum = int.Parse(label2.Text) - 1;
                for (int i = 0; i < int.Parse(label2.Text); i++)
                {
                    string URL = dataGridView1[0, i].Value.ToString();
                    dataGridView1[1, i].Value = URLExists(URL);
                    progressBar1.Value = i;
                }
                for (int i = 0; i < dataGridView1.Rows.Count; i++)
                {

                    if (dataGridView1[1, i].Value.ToString() == "Found")
                    {
                        // dataGridView1[1, i].Style.ForeColor = Color.Green;
                        dataGridView1[1, i].Style.ForeColor = Color.Green;
                    }
                    else
                    {
                        dataGridView1[1, i].Style.ForeColor = Color.Red;
                        // dataGridView1[2, i].Style.ForeColor = Color.Red;
                    }
                }
                label6.Text = "Checking Links Completed";
                button2.Enabled = true;
                button1.Enabled = true;
                button2.Visible = true;
                button1.Visible = true;
            }


     static public String URLExists(string url)
            {
                String result = "Not Found";
               try
                {
                    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
                    request.Method = WebRequestMethods.Http.Head;
                    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                    if (response.StatusCode == HttpStatusCode.OK)
                    {
                        response.Close();
                        result = "Found";
                        return result;
                    }

                }
                catch
                {
                                 return result;
               }

                 return result;

            } 

1 个答案:

答案 0 :(得分:0)

在计时器事件中进行UI更新的一些代码。

private enum Status { Pending, FoundUnprocessed, FoundProcessed, NotFoundNotProcessed, NotFoundProcessed }
private List<Status>   URLStatuses = new List<bool>() ;
private List<string>   URLs        = new List<string>() ;


private void StartUrlsThreads()
{
  for (int i = 0; i < int.Parse(label2.Text); i++)
  {
     URLs.Add(dataGridView1[0, i].Value.ToString());
     URLStatuses.Add(false) ; 
     Thread newThread = new Thread(new ThreadStart(URLExists));
     newThread.Start(URLs[i]) ;
  }
}

private void URLExists(object urlobj)
{
  try
  {
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create((string)urlobj);
    request.Method = WebRequestMethods.Http.Head;
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    if (response.StatusCode == HttpStatusCode.OK)
    {
       response.Close();
       URLStatuses[URLs.IndexOf((string)urlobj)]=Status.FoundUnprocessed ;
    }
    else URLStatuses[URLs.IndexOf((string)urlobj)]=Status.NotFoundUnprocessed ;
  }       
  catch { URLStatuses[URLs.IndexOf((string)urlobj)]=Status.NotFoundUnprocessed ; }
}

private void timer1_Tick(object sender, EventArgs e)
{
  for (int i=0;i<URLs.Count;i++) 
  {
    if (URLStatuses[i]==Status.FoundUnprocessed) 
    {
   URLStatuses[i]==Status.FoundProcessed ;
       // update DataGridView && progressbar
    }
    if (URLStatuses[i]==Status.NotFoundUnprocessed) 
    {
   URLStatuses[i]==Status.NotFoundProcessed ;
       // update DataGridView && progressbar
    }
// stop timer if no more pending status
}