在异步方法崩溃期间调用 ProductService.Insert NopCommerce

Calling ProductService.Insert during an Async method crashes NopCommerce

我编写了一个产品导入插件,可以从一个制表符分隔的文件中导入 50,000 个产品。做个插件很有必要,因为我要下载图片,解析分类,插入厂商等等

我的插件效果很好。它可以在大约 2 分钟内完成 100 个产品。这意味着做 50,000 个产品大约需要 17 个小时。我想通过使我的产品插入方法异步来加快速度。当我去使用 ProductService 的 Insert 方法时,NopCommerce 崩溃了。它崩溃的文件是 WebHelper 和方法 GetCurrentIPAddress。由于某种原因,在 dbcontext.SaveChanges 方法之后立即调用此方法。这真是一个奇怪的问题。这是一些示例代码,也许知道源代码的人知道发生了什么或如何解决这个问题。

我的目标是一次从文本文件中解析和添加多个产品,而不是一次只做一个。

控制器方法:

[HttpPost]
[AdminAuthorize]
public ActionResult ImportProducts(ConfigurationModel model)
{
    try
    {
        string fileName = Server.MapPath(model.Location);
        if (System.IO.File.Exists(fileName))
        {
            _caImportService.ImportProducts(fileName);
        }
        else
        {
            ErrorNotification("File does not exist");
            return RedirectToAction("ImportProducts");
        }
        SuccessNotification(_localizationService.GetResource("Admin.Catalog.Products.Imported"));
        return RedirectToAction("ImportProducts");
    }
    catch (Exception exc)
    {
        ErrorNotification(exc);
        return RedirectToAction("ImportProducts");
    }
}

我的服务Class方法CAImportService.ImportProducts:

public virtual async Task ImportProducts(string fileName)
{
    //Open file and start reading in line by line
    using(var file = new StreamReader(fileName))
    {
        var csv = new CsvReader(file);

        while (csv.Read())
        {
            if (csv.GetField("Blocked").ToLower() == "false")
            {
                //Set up general product properties and add product
                //Omitted for brevity
                await Task.Run(() => ImportProduct(name, shortDescription, description, pleaseNote, sku, manufacturerPartNumber,
                stockQuantity, price, oldPrice, weight, length, width, height, closeout, warranty,
                brand, tags, categories, pictures));
            }

        }
    }
}

私有方法 InsertProduct:

private void ImportProduct(string name, string shortDescription, string description, string pleaseNote, 
    string sku, string manufacturerPartNumber, int stockQuantity, decimal price, decimal oldPrice, 
    decimal weight, decimal length, decimal width, decimal height, string closeout, string warranty,
    string brand, string tags, string categories, string pictures)
{

        var product = new Product();

        // Omitted Set Up Product Properties

        // Crashes after calling this line upon calling dbcontext.SaveChanges
        _productService.InsertProduct(product);

}

我怀疑问题是由于您的控制器中缺少 await。如果没有这个,任何 async 方法将在 ASP.NET 请求上下文中恢复已经完成的请求:

[HttpPost]
[AdminAuthorize]
public async Task<ActionResult> ImportProducts(ConfigurationModel model)
{
    try
    {
        string fileName = Server.MapPath(model.Location);
        if (System.IO.File.Exists(fileName))
        {
            await _caImportService.ImportProducts(fileName);
        }
        else
        {
            ErrorNotification("File does not exist");
            return RedirectToAction("ImportProducts");
        }
        SuccessNotification(_localizationService.GetResource("Admin.Catalog.Products.Imported"));
        return RedirectToAction("ImportProducts");
    }
    catch (Exception exc)
    {
        ErrorNotification(exc);
        return RedirectToAction("ImportProducts");
    }
}