这个问题是我之前提出的问题的后续,与我之前提过的问题相关:如何使用C#并行执行多个“ping”。我已经成功运行了被接受的答案(一个Windows控制台应用程序),但当我尝试在Windows表单应用程序中运行代码时,下面这段代码会在包含
Task.WaitAll(pingTasks.ToArray())
的那一行上卡住。以下是我正在尝试运行的代码: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;
}
}
}
有人知道为什么会冻结吗?
await Task.WhenAll()
而不是Task.WaitAll()
...我还必须在button_click事件中添加一个async
。我会给你回答这个问题的功劳。谢谢! - HydroPowerDeveloperWhenAll()
版本不会起作用,更像是WhenAny()
。你有remainingTasks
,但你没有使用它,我认为这是一个明显的指示存在问题。此外,在 .Net 4.0 上实现WhenAll()
的更简单的方法是使用TaskFactory.ContinueWhenAll(tasks, _ => {})
。 - svickContinueWhenAll
。 - Servy