-1
使うにあたって:私は私が持っているもの、それに対処するための最良の方法だろう私の現在のアプリケーション・スレッドで、スレッドのまわりで私の頭を取得しようとしているスレッド
public void threadsTest() {
Invoke(new MethodInvoker(() => {
// loop over the listview getting the first value
foreach (ListViewItem item in listViewBacklinks.Items)
{
// try...
try
{
var mainURL = item.Text;
using (WebClient wc = new WebClient())
{
try
{
var pageHtml = wc.DownloadString(mainURL);
if (pageHtml.Contains(Text))
{
var subitems = item.SubItems.Add("<a href=\"" + item.SubItems[1].Text + "\">anchor text</a>");
item.BackColor = Color.Green;
}
else
{
item.BackColor = Color.Red;
}
} catch (Exception)
{
item.BackColor = Color.Red;
}
//Helpers.returnMessage("Work done!");
}
} catch (Exception ex) {
Helpers.returnMessage(ex.ToString());
}
}}));
}
private void btnAnalyzeAnchorText_Click(object sender, EventArgs e)
{
// attempting threads
var t = new Thread(threadsTest);
t.Start();
}
私はBackgroundWorkerのそれのように考えをGUIをフリーズすることはありませんでしたが、GUI要素にアクセスするためにinvokeを入れました。私はそれが正しいとは思わないでしょう、今のところGUIは仕事が終わるまで応答しません。私はいくつかのチュートリアルを見ましたしかし、それは完全に沈んでいない、任意のヘルプ/クラップスのヒントは素晴らしいだろう。
'Invoke()'はUIスレッドで指定されたコードを実行するので、あなたのUIがブロックされているのは不思議ではありません。 Invoke/Beginあなたができるコードの最小部分だけをインボークします(ここでBackColorを設定します)。あなたのリストが大きすぎる場合は、UIをあまりに頻繁に更新することで問題が発生する可能性があります。私は、あなたがしようとしていることをよりエレガントにする方法としてasync/awaitを調べることをお勧めします。 –
[c#アプリケーションのGUIをフリーズせずにプロセスを実行する]の可能な複製(http://stackoverflow.com/questions/2773448/c-sharp-run-process-without-freezing-my-apps-gui) –
WebClientは、 GUIの要素なので、あなたのアプリケーションは単にスレッドに適していません。 –