我做错了什么async/await
本文关键字:await async 什么 错了 | 更新日期: 2023-09-27 18:15:33
我正在为我创建一个基本上可以玩游戏的应用程序。它组织突袭,加入突袭,然后发动突袭。我正在尝试异步地完成这些。
一些背景:FormRaidAsync, JoinRaidAsync和LaunchRaidAsync都做web请求。方法本身也设置为异步的,但是当我运行程序时,它只加入大约2-3个帐户/秒。
我做错了什么,或者async/await不一定在一个新线程上运行每个请求?如果是这种情况,我如何调整这段代码以接近10/秒的速率加入帐户?我是否必须使用其他形式的多线程来一次发出更多请求?
谢谢每一个人。如果需要更多的细节,请告诉我。
public async Task<string> StartRaidAsync()
{
string raid_id = String.Empty;
try
{
raid_id = await this.Helper.FormRaidAsync(this.TargetRaid.Id, this.Former.Id, this.TargetRaid.IsBossRaid).ConfigureAwait(false);
Console.WriteLine("Formed raid with {0}.", this.Former.Name);
List<Task> joinTasks = new List<Task>();
foreach (var joiner in this.Joiners)
{
try
{
joinTasks.Add(this.Helper.JoinRaidAsync(raid_id, joiner.Id));
}
catch (Exception) // Not sure which exceptions to catch yet.
{
Console.WriteLine("Error joining {0}. Skipped.", joiner.Name);
}
}
Task.WaitAll(joinTasks.ToArray());
await this.Helper.LaunchRaidAsync(raid_id, this.Former.Id).ConfigureAwait(false);
Console.WriteLine("{0} launched raid.", this.Former.Name);
}
catch (Exception) // Not sure which exceptions to catch yet.
{
return "ERROR";
}
return raid_id;
}
在JoinRaidAsync :
public async Task JoinRaidAsync(string raid_id, string suid)
{
var postUrl = "some url";
var postData = "some data";
await this.Socket.PostAsync(postUrl, postData).ConfigureAwait(false);
Console.WriteLine("Joined {0}.", suid);
}
里面的插座。PostAsync:
public async Task<string> PostAsync(string url, string postData)
{
return await SendRequestAsync(url, postData).ConfigureAwait(false);
}
在SendRequestAsync :
protected virtual async Task<string> SendRequestAsync(string url, string postData)
{
for (int i = 0; i < 3; i++)
{
try
{
HttpWebRequest request = this.CreateRequest(url);
if (!String.IsNullOrWhiteSpace(postData))
{
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = postData.Length;
var stream = await request.GetRequestStreamAsync().ConfigureAwait(false);
using (StreamWriter writer = new StreamWriter(stream))
{
await writer.WriteAsync(postData).ConfigureAwait(false);
await writer.FlushAsync().ConfigureAwait(false);
}
}
using (HttpWebResponse response = (HttpWebResponse)(await request.GetResponseAsync().ConfigureAwait(false)))
{
string responseString = String.Empty;
using (StreamReader reader = new StreamReader(response.GetResponseStream()))
{
responseString = await reader.ReadToEndAsync().ConfigureAwait(false);
}
return responseString;
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
return String.Empty;
}
我做错了什么,或者async/await不一定在一个新线程上运行每个请求?
async
/await
不创建新线程。
异步代码可以一次处理多个请求。当然,这些请求的速度是由web服务调用的速度决定的。如果是这种情况,我如何调整这段代码以接近10/秒的速率加入帐户?
我现在在代码中看到的唯一错误是它混合了阻塞和异步代码。替换:
Task.WaitAll(joinTasks.ToArray());
:
await Task.WhenAll(joinTasks.ToArray());
如果您仍然看到问题,这可能是由于您的web服务或其他支持代码(如JoinRaidAsync
中的代码)。