Questa domanda è un follow-up a una domanda precedente che avevo chiesto:Task Parallel biblioteca di codice si blocca in un'applicazione Windows Form - Funziona bene come una console di Windows Application
How to Perform Multiple "Pings" in Parallel using C#
ero in grado di ottenere la risposta accettata (un'applicazione per console Windows) per funzionare, ma quando ho provato a eseguire il codice in un'applicazione Windows Form, il codice seguente verrà bloccato sulla riga contenente Task.WaitAll(pingTasks.ToArray())
. Ecco il codice che sto provando a fare funzionare:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net.NetworkInformation;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
List<String> addresses = new List<string>();
for (Int32 i = 0; i < 10; ++i) addresses.Add("microsoft.com");
List<Task<PingReply>> pingTasks = new List<Task<PingReply>>();
foreach (var address in addresses)
{
pingTasks.Add(PingAsync(address));
}
//Wait for all the tasks to complete
Task.WaitAll(pingTasks.ToArray());
//Now you can iterate over your list of pingTasks
foreach (var pingTask in pingTasks)
{
//pingTask.Result is whatever type T was declared in PingAsync
textBox1.Text += Convert.ToString(pingTask.Result.RoundtripTime) + Environment.NewLine;
}
}
private Task<PingReply> PingAsync(string address)
{
var tcs = new TaskCompletionSource<PingReply>();
Ping ping = new Ping();
ping.PingCompleted += (obj, sender) =>
{
tcs.SetResult(sender.Reply);
};
ping.SendAsync(address, new object());
return tcs.Task;
}
}
}
Qualcuno ha qualche idea sul perché si gela?
Sì !!! Ho dovuto usare 'attendere Task.WhenAll()' invece di 'Task.WaitAll()' ... Ho anche dovuto aggiungere un 'async' all'evento button_click. Ti darò il merito di rispondere a questa domanda. Grazie! – HydroPowerDeveloper
Per completezza, possiamo ottenere la soluzione alternativa quando si utilizza C# prima della 5.0? – Pete
In secondo luogo la richiesta di Pete ... Anch'io vorrei conoscere la <5.0 soluzione. – HydroPowerDeveloper