我有一个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;
}
答案 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
}