C# C WebClient对API的异步/等待并行调用
我不熟悉异步/等待。我必须将api和sace结果调用到txt文件中。我使用webclient.OpenRead并能够保存文件。我想用API的多个输入来运行我的代码,我想并行运行它 对于顺序操作,我使用WebClient.OpenRead作为代码C# C WebClient对API的异步/等待并行调用,c#,async-await,webclient,C#,Async Await,Webclient,我不熟悉异步/等待。我必须将api和sace结果调用到txt文件中。我使用webclient.OpenRead并能够保存文件。我想用API的多个输入来运行我的代码,我想并行运行它 对于顺序操作,我使用WebClient.OpenRead作为代码 class Program { static void Main(string[] args) { var name = "test1"; var filename = $"c:\\temp\\{name}
class Program
{
static void Main(string[] args)
{
var name = "test1";
var filename = $"c:\\temp\\{name}.txt";
var url = $"https://testapi?name eq '{name}')";
using (var client = new WebClient())
{
using (Stream stream = client.OpenRead(url))
using (StreamReader streamReader = new StreamReader(stream))
using (JsonTextReader reader = new JsonTextReader(streamReader))
{
reader.SupportMultipleContent = true;
var serializer = new JsonSerializer();
var parsedData = serializer.Deserialize(reader).ToString();
File.WriteAllText(filename, parsedData);
Console.WriteLine($"Result save at {filename}");
}
}
}
}
对于并行操作,我尝试使用WebClient.OpenReadAsync,但我的代码没有将文件保存在c:\temp中\
static void Main(string[] args)
{
var names = new string[] { "test1", "test2" };
foreach (var name in names)
{
var filename = $"c:\\temp\\{name}.txt";
var url = $"https://testapi?name eq '{name}') ";
var client = new WebClient();
client.OpenReadCompleted += (sender, e) =>
{
Stream reply = (Stream)e.Result;
StreamReader s;
s = new StreamReader(reply);
using (JsonTextReader reader = new JsonTextReader(s))
{
reader.SupportMultipleContent = true;
var serializer = new JsonSerializer();
var parsedData = serializer.Deserialize(reader).ToString();
File.WriteAllText(filename, parsedData);
Console.WriteLine($"Result save at {filename}");
}
};
client.OpenReadAsync(new Uri(url));
}
}
我的代码有什么问题?有什么建议吗 下面是与您的任务并行的代码。注意,我没有使用foreach循环,在您的例子中,这意味着顺序任务的执行。重要的一点是,首先我创建了一个应该执行的任务列表,然后我通过包装一个任务列表创建了一个任务,然后我使用等待任务结束 另外,请阅读关于。以及它的行为。它有效地阻止了应用程序的线程,这在更复杂的应用程序中是不需要的
static void Main(string[] args)
{
var tasks = new[] {"test1", "test2"}.Select(SaveData);
Task.WhenAll(tasks).Wait();
}
private static async Task SaveData(string fileName)
{
var filename = $"c:\\temp\\{fileName}.txt";
var url = $"https://testapi?name eq '{fileName}') ";
var client = new WebClient();
client.OpenReadCompleted += (sender, e) =>
{
var reply = e.Result;
StreamReader s;
s = new StreamReader(reply);
using (var reader = new JsonTextReader(s))
{
reader.SupportMultipleContent = true;
var serializer = new JsonSerializer();
var parsedData = serializer.Deserialize(reader).ToString();
File.WriteAllText(filename, parsedData);
Console.WriteLine($"Result save at {fileName}");
}
};
await client.OpenReadTaskAsync(new Uri(url));
}
谢谢你的回复。它起作用了。局部地,我从e.Result得到错误,因为{远程服务器返回了一个错误:500内部服务器错误。}。这可能来自服务。