C# WebClient 使用 Async/Await 并行调用 API
C# WebClient parallel call to API with Async/ Await
我是 Async/Await 的新手。我必须调用 api 并将结果保存到一个 txt 文件中。我使用 webclient.OpenRead 并能够保存文件。我想 运行 我的代码有多个输入 API 并且我想 运行 它并行。
对于顺序操作,我使用 WebClient.OpenRead() 作为代码工作。
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 循环,在您的情况下这意味着顺序任务执行。重要的部分是,首先我创建了一个应该执行的任务列表,然后我通过包装任务列表用 Task.WhenAll 创建了一个任务,然后我用 .Wait(); 等待任务结束;
此外,阅读有关 .Wait() 的内容。以及它的行为方式。它有效地阻塞了应用程序的线程,这在更复杂的应用程序中可能是不希望的。
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));
}
我是 Async/Await 的新手。我必须调用 api 并将结果保存到一个 txt 文件中。我使用 webclient.OpenRead 并能够保存文件。我想 运行 我的代码有多个输入 API 并且我想 运行 它并行。
对于顺序操作,我使用 WebClient.OpenRead() 作为代码工作。
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 循环,在您的情况下这意味着顺序任务执行。重要的部分是,首先我创建了一个应该执行的任务列表,然后我通过包装任务列表用 Task.WhenAll 创建了一个任务,然后我用 .Wait(); 等待任务结束;
此外,阅读有关 .Wait() 的内容。以及它的行为方式。它有效地阻塞了应用程序的线程,这在更复杂的应用程序中可能是不希望的。
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));
}