public static void BeginTest(string url, int times, int gap, CancellationToken ct) { MainWindow.Current.TheList.Items.Clear(); for (int i = 0; i < times; i++) { int num = i; using (WebClient client = new WebClient()) { TestRecord record = new TestRecord(); record.Number = num + 1; client.DownloadStringCompleted += (sender, e) => { string response = e.Result; var sendTime = record.RawSendTime; var receiveTime = DateTime.Now; record.ReceiveTime = FormatTime(receiveTime); record.Delay = (receiveTime - sendTime).TotalMilliseconds; record.Response = response; MainWindow.Current.Dispatcher.BeginInvoke(new Action(() => { MainWindow.Current.TheList.Items.Refresh(); })); }; Task.Factory.StartNew(() => { Thread.Sleep(num * gap); record.RawSendTime = DateTime.Now; record.SendTime = FormatTime(record.RawSendTime); client.DownloadStringAsync(new Uri(url)); MainWindow.Current.Dispatcher.BeginInvoke(new Action(() => { MainWindow.Current.TheList.Items.Add(record); })); }, ct); } } }
public static async Task <TestRecord> DoSingleRequest(string url, int number, int gap) { await Task.Delay(number *gap); using (WebClient client = new WebClient { Encoding = System.Text.Encoding.Default }) { TestRecord record = new TestRecord(); var sendTime = DateTime.Now; string response = await client.DownloadStringTaskAsync(url); var receiveTime = DateTime.Now; record.Number = number; record.SendTime = FormatTime(sendTime); record.ReceiveTime = FormatTime(receiveTime); record.Delay = (receiveTime - sendTime).TotalMilliseconds; record.Response = response; return(record); } }
public static async Task BeginTest(string url, int times, int gap, CancellationToken ct) { MainWindow.Current.TheList.Items.Clear(); List <TestRecord> tasks = new List <TestRecord>(); for (int i = 0; i < times; i++) { int num = i; using (WebClient client = new WebClient()) { TestRecord record = new TestRecord(); record.Number = num + 1; var task = Task.Delay(num * gap, ct).ContinueWith(t => { record.RawSendTime = DateTime.Now; record.SendTime = FormatTime(record.RawSendTime); return(client.DownloadStringTaskAsync(url)); }, ct); //var task = new Task<Task<string>>(async () => //{ // await Task.Delay(num * gap); // record.RawSendTime = DateTime.Now; // record.SendTime = FormatTime(record.RawSendTime); // MainWindow.Current.TheList.Items.Add(record); // return client.DownloadStringTaskAsync(url); //}, ct); record.Task = task; tasks.Add(record); } } foreach (var record in tasks) { string response = await await record.Task; var sendTime = record.RawSendTime; var receiveTime = DateTime.Now; record.ReceiveTime = FormatTime(receiveTime); record.Delay = (receiveTime - sendTime).TotalMilliseconds; record.Response = response; MainWindow.Current.TheList.Items.Add(record); } //List<Task<TestRecord>> requests = new List<Task<TestRecord>>(); //for (int i = 0; i < times; i++) //{ // requests.Add(DoSingleRequest(url, i + 1, gap)); //} //foreach (var r in requests) //{ // MainWindow.Current.TheList.Items.Add(await r); //} //var requests = Enumerable.Range(0, times).Select(async i => //{ // await Task.Delay(gap); // return DoSingleRequest(url, i + 1); //}).ToList(); //requests.ForEach(async r => //{ // MainWindow.Current.TheList.Items.Add(await r); //}); //for (int i = 0; i < times; i++) //{ // await AddRecord(url, i + 1); // //await Task.Delay(gap); //} }