我使用一个并行循环从C#向API发布数据,其中1000+对象在列表中。反应要么成功,要么失败。我需要用适当的ID在日志文件中记录失败的记录。当我将对象发送到API时,我将ID保存在循环中的局部变量中,并将数据发布。当响应返回时,我假设响应是我为该ID所得到的,并编写日志。
ParallelOptions po = new ParallelOptions
{
MaxDegreeOfParallelism = 2
};
Parallel.ForEach(lstPost, po, obj=>
{
string id= obj.Id;
var response= API calls goes here......;
if(response.Status== "ERROR")
{
//log the details
Log.Write(ID : response.Status)
}
}我怀疑,是否有机会得到别人对别人身份证的回应?
发布于 2022-03-10 15:50:16
只有当API调用是线程安全的时候,它才是安全的。这将是一个相当安全的假设,但我总是建议在进行任何有关线程安全性的假设之前检查文档。
循环体中的id和响应是局部变量,因此没有在任何线程之间共享,因此完全安全。通常,线程安全问题是共享可变状态,如果状态是非共享的或不可变的,则它是完全安全的。
您还应该考虑日志记录函数的线程安全性。大多数日志库都提供线程安全的日志记录功能,但还是要检查文档是否安全。直接写入文件可能需要一些同步(如锁)才能安全。
然而,这样一个并行循环将启动两个线程,每个线程进行API调用。大多数情况下,发出API调用可能只是等待结果,而在此期间,线程只会阻塞,这有点浪费。使用Parallel.ForEachAsync或Task.WhenAll可以异步进行API调用,因此在等待响应时根本不使用任何线程,从而节省了一些资源。
https://stackoverflow.com/questions/71426568
复制相似问题