Я пытаюсь запустить шаблон потребительского кода в моем коде, чтобы сделать его быстрее. Мой процесс заключается в том, что я хочу использовать несколько задач, выполняющихся одновременно, для получения данных, их оборачивания в пользовательский класс Product и добавления продукта в очередь. Затем потребитель сохраняет его в БД через Entity Framework с помощью одной задачи. Я протестировал код, который у меня сейчас есть, вставив около 1000 продуктов в базу данных, а затем выполняя запрос sql, чтобы проверить наличие дублирующихся строк. SQL Результат запроса
Как вы видите на картинке, в базе данных появляется около 30 товаров более одного раза.
Это мой код:
public static void GetAllProductsFromIndexes_AndPutInDB(List<IndexModel> indexes, ProductContext context)
{
BlockingCollection<IndexModel> inputQueue = CreateInputQueue(indexes);
BlockingCollection<Product> productsQueue = new BlockingCollection<Product>(500);
var consumer = Task.Run(() =>
{
foreach (Product readyProduct in productsQueue.GetConsumingEnumerable())
{
InsertProductInDB(readyProduct, context);
}
});
var producers = Enumerable.Range(0, 25)
.Select(_ => Task.Run(() =>
{
foreach (IndexModel index in inputQueue.GetConsumingEnumerable())
{
Product product = new Product();
byte[] unconvertedByteArray;
string xml;
string url = @"https://data.Icecat.biz/export/freexml.int/en/";
unconvertedByteArray = DownloadIcecatFile(index.IndexNumber.ToString() + ".xml", url);
xml = Encoding.UTF8.GetString(unconvertedByteArray);
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xml);
GetProductDetails(product, xmlDoc, index);
XmlNodeList nodeList = (xmlDoc.SelectNodes("ICECAT-interface/Product/ProductFeature"));
product.FeaturesLink = GetProductFeatures(product, nodeList);
nodeList = (xmlDoc.SelectNodes("ICECAT-interface/Product/ProductGallery/ProductPicture"));
product.Images = GetProductImages(nodeList);
productsQueue.Add(product);
}
})).ToArray();
Task.WaitAll(producers);
productsQueue.CompleteAdding();
consumer.Wait();
}
В общем, мой вопрос: что я могу сделать, чтобы избежать этого?