更多新手问题:
此代码从主窗口的列表中获取多个代理(我不知道如何使变量在不同函数之间可用)并对每个代理进行检查(简单httpwebrequest
),然后将它们添加到名为的列表中finishedProxies
.
由于某种原因,当我按下开始按钮时,整个程序挂起。我的印象是,并行为每个操作创建单独的线程,而单独保留 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
按下启动按钮后,它会使程序冻结。它以前对我有用,但我使用了 Thread 类。
如何从内部更新 UIParallel.Foreach
我该如何做Parallel.Foreach
以便在工作时不会使 UI 冻结?
这是整个代码。 http://pastie.org/2958219
您不得在 UI 线程中启动并行处理。请参阅“避免在 UI 线程上执行并行循环”标题下的示例这一页 http://msdn.microsoft.com/en-us/library/dd997392.aspx.
Update:或者,您可以简单地手动创建一个新线程并开始在其中进行处理,正如我看到您所做的那样。这也没有什么问题。
此外,正如 Jim Mischel 指出的那样,您同时从多个线程访问列表,因此存在竞争条件。要么替代ConcurrentBag http://msdn.microsoft.com/en-us/library/dd381779.aspx for List
,或将列表包装在lock
每次访问它们时都声明。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)