gpt4 book ai didi

c# - 为什么这个 Parallel.ForEach 代码会卡住程序?

转载 作者:IT王子 更新时间:2023-10-29 04:53:54 34 4
gpt4 key购买 nike

更多新手问题:

这段代码从主窗口的列表中抓取了一些代理(我不知道如何让变量在不同的函数之间可用)并检查每个代理(简单的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,它使程序在按下开始按钮后卡住。它以前对我有用,但我使用了 Thread 类。

如何从 Parallel.Foreach 内部更新 UI,以及如何使 Parallel.Foreach 正常工作,以免 UI 在运行时卡住有用吗?

Here's the whole code.

最佳答案

您不得在您的 UI 线程中启动并行处理。请参阅 this page 中“避免在 UI 线程上执行并行循环”标题下的示例.

更新:或者,您可以简单地手动创建一个新线程并在其中开始处理,正如我所看到的那样。这也没有错。

此外,正如 Jim Mischel 指出的那样,您同时从多个线程访问列表,因此存在竞争条件。要么替代ConcurrentBag对于 List,或者在每次访问它们时将列表包装在 lock 语句中。

关于c# - 为什么这个 Parallel.ForEach 代码会卡住程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8365346/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com