C# HttpClient GetAsync需要约2秒
我的wpf程序从文本文件中读取命令,然后通过HttpClient发送这些命令。 每个GetAsync响应大约需要2秒才能完成。这似乎太长了,尤其是当我有50条命令要发送时 HttpClient发送/接收GetAsync消息的时间是否正常?有没有更快的方法C# HttpClient GetAsync需要约2秒,c#,wpf,http,C#,Wpf,Http,我的wpf程序从文本文件中读取命令,然后通过HttpClient发送这些命令。 每个GetAsync响应大约需要2秒才能完成。这似乎太长了,尤其是当我有50条命令要发送时 HttpClient发送/接收GetAsync消息的时间是否正常?有没有更快的方法 static readonly HttpClient client = new HttpClient(); public MainWindow() { InitializeComponen
static readonly HttpClient client = new HttpClient();
public MainWindow()
{
InitializeComponent();
}
private async void Register_ClickAsync(object sender, RoutedEventArgs e)
{
int counter = 0;
string line;
System.IO.StreamReader file = new System.IO.StreamReader(@"C\path.txt");
while ((line = file.ReadLine()) != null)
{
try
{
var watch = Stopwatch.StartNew();
HttpResponseMessage response = await client.GetAsync(line);
response.EnsureSuccessStatusCode();
string responseBody = await response.Content.ReadAsStringAsync();
watch.Stop();
var elapsedMS = watch.ElapsedMilliseconds;
RequestTextBox.Text += "\n" + elapsedMS;
}
catch (HttpRequestException ex)
{
Console.WriteLine("\nException Caught!");
Console.WriteLine("Message :{0} ", ex.Message);
this.RequestTextBox.Text += ("\n" + "Message: {0} ", ex.Message);
}
}
file.Close();
}
}
更新:
这个原始程序是一个.net核心WPF应用程序。我用完全相同的代码创建了一个.NETFramework WPF应用程序。net framework应用程序需要2000毫秒来发送第一个HttpClient GetAsync命令,然后您的代码等待每个请求
您可以通过调用
GetAsync
创建许多任务,然后使用Task.WhenAll()
等待所有任务。它会更快。您没有正确使用异步范例。您正在立即等待异步调用,因此它的行为与同步方法相同。异步方法的思想是,它开始工作并在后台运行,同时不阻止其他线程执行。这允许您一次运行多个线程,然后在准备使用它们时返回它们。在这种情况下,我强烈建议您使用。他们以做早餐为例,在本例中,他们做得不正确,正如你所问的:
Coffee cup = PourCoffee();
Console.WriteLine("coffee is ready");
Task<Egg> eggsTask = FryEggs(2);
Egg eggs = await eggsTask;
Console.WriteLine("eggs are ready");
Task<Bacon> baconTask = FryBacon(3);
Bacon bacon = await baconTask;
Console.WriteLine("bacon is ready");
Task<Toast> toastTask = ToastBread(2);
Toast toast = await toastTask;
ApplyButter(toast);
ApplyJam(toast);
Console.WriteLine("toast is ready");
Juice oj = PourOJ();
Console.WriteLine("oj is ready");
Console.WriteLine("Breakfast is ready!");
Coffee cup=PourCoffee();
控制台。WriteLine(“咖啡准备好了”);
任务eggsTask=煎蛋(2);
鸡蛋=等待鸡蛋;
控制台。WriteLine(“鸡蛋准备好了”);
任务baconTask=FryBacon(3);
培根培根=等待任务;
控制台。WriteLine(“培根准备好了”);
任务toastTask=烤面包(2);
Toast Toast=等待Toast任务;
苹果面包;
苹果酱(吐司);
控制台。WriteLine(“toast已准备就绪”);
果汁oj=PourOJ();
控制台写入线(“oj已准备就绪”);
控制台。WriteLine(“早餐准备好了!”);
若要修复它,必须调用Task.WhenAny()或Task.WhenAll()。这允许您一次运行所有任务,并在任务完成后(或在任务完成时)返回它们。这将大大提高您的性能
static async Task Main(string[] args)
{
Coffee cup = PourCoffee();
Console.WriteLine("coffee is ready");
var eggsTask = FryEggsAsync(2);
var baconTask = FryBaconAsync(3);
var toastTask = MakeToastWithButterAndJamAsync(2);
var allTasks = new List<Task>{eggsTask, baconTask, toastTask};
while (allTasks.Any())
{
Task finished = await Task.WhenAny(allTasks);
if (finished == eggsTask)
{
Console.WriteLine("eggs are ready");
}
else if (finished == baconTask)
{
Console.WriteLine("bacon is ready");
}
else if (finished == toastTask)
{
Console.WriteLine("toast is ready");
}
allTasks.Remove(finished);
}
Juice oj = PourOJ();
Console.WriteLine("oj is ready");
Console.WriteLine("Breakfast is ready!");
async Task<Toast> MakeToastWithButterAndJamAsync(int number)
{
var toast = await ToastBreadAsync(number);
ApplyButter(toast);
ApplyJam(toast);
return toast;
}
}
static async Task Main(字符串[]args)
{
咖啡杯=PourCoffee();
控制台。WriteLine(“咖啡准备好了”);
var eggsTask=FryEggsAsync(2);
var baconTask=FryBaconAsync(3);
var toastTask=maketoaswithbutterandjamasync(2);
var allTasks=新列表{eggsTask、baconTask、toastask};
while(allTasks.Any())
{
任务完成=等待任务。WhenAny(所有任务);
如果(已完成==eggsTask)
{
控制台。WriteLine(“鸡蛋准备好了”);
}
else if(完成==baconTask)
{
控制台。WriteLine(“培根准备好了”);
}
else if(已完成==toast任务)
{
控制台。WriteLine(“toast已准备就绪”);
}
所有任务。删除(已完成);
}
果汁oj=PourOJ();
控制台写入线(“oj已准备就绪”);
控制台。WriteLine(“早餐准备好了!”);
异步任务MakeToastWithButterAndJamAsync(整数)
{
var toast=等待ToastBreadAsync(数字);
苹果面包;
苹果酱(吐司);
回敬祝酒;
}
}
它似乎很长。我把提琴手放在中间,看看到底是什么在占用时间,当你用邮递员执行这个请求时,你需要多少时间?500ms@canton7我正在研究Fiddler,以前从未使用过它。当您改用HttpWebRequest时,问题是否仍然存在?