Сведения о сотруднике становятся нулевыми в цикле C# Parallel.ForEach при получении данных из API [дубликат]C#

Место общения программистов C#
Anonymous
Сведения о сотруднике становятся нулевыми в цикле C# Parallel.ForEach при получении данных из API [дубликат]

Сообщение Anonymous »

Я столкнулся с проблемой при получении сведений о сотруднике из API с помощью параллельного цикла foreach в C#. Обратите внимание, что я использовал concurrentbag для задач, чтобы сделать его потокобезопасным и добавить элементы в список внутри блокировки, чтобы избежать одновременного доступа к нему нескольких потоков.
Вот что я Я делаю:
  • У меня есть список номеров сотрудников.
  • Я перебираю этот список, используя параллельный цикл foreach .
  • Внутри цикла я вызываю API с текущим номером сотрудника, чтобы получить сведения о сотруднике.
  • Я добавляю полученные сведения о сотруднике в list.
Однако я заметил, что иногда объект сотрудника в списке сведений о сотруднике становится нулевым. Я не знаю, почему это происходит и как это решить.
public List GetEmployees(List empNumber)
{
List employeeList = new List();

try
{
List cb = new List();
var tasks = new ConcurrentBag();

Parallel.ForEach(empNumber, reference =>
{
tasks.Add(Task.Run(() =>
{
var importedEmployee = GetEmployeeDetails(reference.ToString());

if (importedEmployee != null)
{
lock (cb)
{
cb.Add(importedEmployee);
}
}
}));
});

Task.WaitAll(tasks.Where(t => t != null).ToArray());

employeeList.AddRange(cb.ToList());
}
catch (Exception ex)
{
Log.Error("Error");
}

return employeeList;
}

public ImportedEmployee GetEmployeeDetails(string empNum)
{
ImportedEmployee employeeDetails = new ImportedEmployee();

try
{
var responseString = ServiceRequest($"Employees/{empNum}", null, HttpVerbs.Get).ToString();

JObject result = JObject.Parse(responseString);
employeeDetails.FirstName = result["FirstName"].ToString();
employeeDetails.LastName = result["LastName"].ToString();
employeeDetails.Username = result["LoginId"].ToString();
}
catch (Exception ex)
{
Log.Error("Error retrieving employee details.", ex);
}

return employeeDetails;
}

public string ServiceRequest(string URI, string PostJSON, HttpVerbs Method)
{
string responseString;
try
{
HttpResponseMessage resp;
using (HttpClient client = new HttpClient() { Timeout = TimeSpan.FromSeconds(Configuration.ClientTimeout) })
{
HttpRequestMessage request = new HttpRequestMessage();
switch (Method)
{
case HttpVerbs.Get:
request = new HttpRequestMessage(HttpMethod.Get, BaseURL + URI);
break;
default:
request = new HttpRequestMessage(HttpMethod.Post, BaseURL + URI);
request.Content = new StringContent(PostJSON, null, "application/json");
break;
}
request.Headers.Add("Authorization", $"Bearer {AuthToken.Token}");
resp = client.SendAsync(request).Result;
}
responseString = resp.Content.ReadAsStringAsync().Result;
}
catch (Exception ex)
{
Log.Error("Error", ex);
responseString = null;
}
return responseString;
}

public class ImportedEmployee
{
public string EmployeeNumber { get; set; }
public string Username { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}


Подробнее здесь: https://stackoverflow.com/questions/781 ... etching-da

Вернуться в «C#»