我一直在阅读有关异步编程的好处。好处似乎太大了,不能继续忽视它。因此,我决定立即进入异端,任务之地,等待。我创建了一个简单的类来对我的Web Api执行多个并发的POST操作。执行多个并发任务的最佳方法是什么?
调用方法:
...
int tasks = 100;
for (var i = 0; i < tasks ; i++)
{
int taskNumber = i + 1;
var task = Task.Run(() => Post(taskNumber , address, client));
}
System.Console.ReadKey();
任务来运行:
private static async Task Post(int taskNumber, Uri address, HttpClient client)
{
System.Console.WriteLine("Started Task#: {0}", taskNumber);
Stopwatch sw = new Stopwatch();
sw.Start();
var status = GetDeviceStatus();
var response = await client.PostAsJsonAsync<DeviceStatus>(address, status);
sw.Stop();
if (response.IsSuccessStatusCode)
{
Uri statusUri = response.Headers.Location;
System.Console.WriteLine("{0}- Elapsed: {1} Path: {2}", taskNumber, sw.Elapsed, statusUri.ToString());
}
else
{
System.Console.WriteLine("{0}- Elapsed: {1} Path: {2}", taskNumber, sw.Elapsed, response.ToString());
}
}
的代码按预期工作;然而,这是执行这项任务的最佳方式(赦免双关语)?任何建议将不胜感激。
我认为使用任务是处理这种问题的好方法..我会说一个好方法..但是记住比赛条件..不要忘记让它线程安全..否则它的完美 –
只是因为你把'线程= 100“并不意味着它使用100个线程。你所做的只是实例化100个Task对象。 TPL如何决定创建线程和安排任务取决于TPL。将它们称为“任务”而不是“线程”会更准确。 – Enigmativity
您的代码存在的一个问题是您对所有100个任务使用相同的“HttpClient”实例。对于调用实例方法,“HttpClient”对象不是线程安全的。您需要为每个呼叫创建一个新的客户端。 – Enigmativity