多くの初心者質問:なぜこのParallel.ForEachコードはプログラムをフリーズしますか?
このコードは、メインウィンドウのリストからいくつかのプロキシを取得します(変数はさまざまな機能間で利用可能にする方法を理解できませんでした)。 httpwebrequest)、それをfinishedProxiesというリストに追加します。
私はスタートボタンを押して何らかの理由で、プログラム全体がハングアップします。私はParallelがUIスレッドだけを残してアクションごとに別々のスレッドを作成し、応答性があるという印象を受けましたか?
private void start_Click(object sender, RoutedEventArgs e)
{
// Populate a list of proxies
List<string> proxies = new List<string>();
List<string> finishedProxies = new List<string>();
foreach (string proxy in proxiesList.Items)
{
proxies.Add(proxy);
}
Parallel.ForEach<string>(proxies, (i) =>
{
string checkResult;
checkResult = checkProxy(i);
finishedProxies.Add(checkResult);
// update ui
/*
status.Dispatcher.Invoke(
System.Windows.Threading.DispatcherPriority.Normal,
new Action(
delegate()
{
status.Content = "hello" + checkResult;
}
)); */
// update ui finished
//Console.WriteLine("[{0}] F({1}) = {2}", Thread.CurrentThread.Name, i, CalculateFibonacciNumber(i));
});
}
私はParallel.Foreach内のUIに変更を加えるためにコメントアウトし、スタートボタンを押した後、それはプログラムの凍結を作るのコードを使用してみました。以前は私のために働いていましたが、私はスレッドクラスを使用しました。
Parallel.Foreach内からUIを更新するにはどうすればいいですか?Parallel.Foreachを動作させてUIをフリーズさせないようにするにはどうすればいいですか?あなたのコードで
あなたは呼び出し要求でUIスレッドを撃退していますが、通常の任務をやり遂げることはもうありません。 UIの再描画に似ています。少なくとも優先度をバックグラウンドに下げる。 –
@dsp_099б「これは私のために働いたが、私はスレッドクラスを使った」という意味はどういう意味ですか? – Fulproof