Más preguntas para usuarios novatos:¿Por qué este código Parallel.ForEach congela el programa?
Este código captura un número de proxies de la lista en la ventana principal (no pude entender cómo hacer que las variables estén disponibles entre diferentes funciones) y hace una comprobación de cada uno (simple httpwebrequest) y luego los agrega a una lista llamada finishedProxies.
Por alguna razón, cuando presiono el botón de inicio, todo el programa cuelga. Tenía la impresión de que Parallel crea hilos separados para cada acción, dejando el hilo de la interfaz de usuario solo para que sea receptivo.
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));
});
}
He intentado usar el código que se comenta fuera a realizar cambios en la interfaz de usuario dentro de la Parallel.Foreach y hace que el programa de congelación después de pulsar el botón de inicio. Me funcionó antes, pero usé la clase Thread.
¿Cómo puedo actualizar la UI desde el Parallel.Foreach y cómo hago que Parallel.Foreach funcione para que no se congele mientras está funcionando?
Estás golpeando el hilo de la interfaz de usuario con las solicitudes de invocación, ya no se ocupa de hacer sus tareas habituales. Como pintar la IU. Al menos baje la prioridad a Background. –
@ dsp_099б ¿A qué te refieres con "Me funcionó antes pero utilicé la clase Thread"? – Fulproof