To pytanie jest kontynuacją poprzedniego pytania, które ja zapytałem:Task Parallel Library Kod zamarza w Windows Forms Application - Działa dobrze jako aplikacji konsoli systemu Windows
How to Perform Multiple "Pings" in Parallel using C#
Mogłem uzyskać akceptowaną odpowiedź (aplikację konsoli systemu Windows) do działania, ale gdy próbowałem uruchomić kod w aplikacji formularzy systemu Windows, poniższy kod zostanie zablokowany w wierszu zawierającym Task.WaitAll(pingTasks.ToArray())
. Oto kod, który próbuję uruchomić:
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;
}
}
}
Czy ktoś ma jakieś pomysły, dlaczego jest mróz?
Tak! Musiałem użyć 'await Task.WhenAll()' zamiast 'Task.WaitAll()' ... Musiałem również dodać 'async' do zdarzenia button_click. Dam ci szansę na odpowiedź na to pytanie. Dzięki! – HydroPowerDeveloper
W celu uzyskania kompletności, czy możemy uzyskać alternatywne rozwiązanie przy korzystaniu z C# przed 5.0? – Pete
I druga prośba Pete'a ... Ja też chciałbym poznać rozwiązanie <5.0. – HydroPowerDeveloper