【问题标题】:Asynchronous operations for a repository to save new data to database存储库的异步操作以将新数据保存到数据库
【发布时间】:2017-02-21 16:54:20
【问题描述】:

我有一个名为 Repository 的类,它处理 CSV 文件并从解析的值创建对象。

这个类中有两个列表属性:

public static List<Product> ProductsList { get; set; }
public static List<Category> CategoriesList { get; set; }

Repository 类中有一个方法,它解析发布的 CSV 文件以创建产品和类别列表,这些产品和类别分别分配给方法内的 ProductsListCategoriesList

public static void CSVToList(HttpPostedFileBase CSVFile){}

然后在这个类中还有另一个方法将产品和类别保存到dbContext中。这两个方法都是从Controller中的Repository类外部调用的。

public static void SaveProducts()
        {
            foreach(var item in ProductsList)
            {
                db.Products.Add(item);
            }

            foreach(var item in CategoriesList)
            {
                db.Categories.Add(item);
            }

            await db.SaveChangesAsync();
        }

当我运行应用程序并使用 CSV 文件发送发布请求时,我收到此错误:

此时无法启动异步操作。异步操作只能在异步处理程序或模块内或在页面生命周期中的某些事件期间启动。如果在执行 Page 时发生此异常,请确保将 Page 标记为 。此异常还可能表示尝试调用“async void”方法,在 ASP.NET 请求处理中通常不支持该方法。相反,异步方法应该返回一个 Task,调用者应该等待它。

Source Error: 


Line 348:            {
Line 349:                Repository.CSVToList(viewModel.CSVFile);
Line 350:                Repository.SaveProducts();
Line 351:
Line 352:                return RedirectToAction("Index", new { ManageMessageId.DataImportSuccess });

Source File: C:\src\smokindonut\Valueville\ValueVille\Controllers\ManageController.cs    Line: 350 

我试图使控制器方法成为一个异步任务,调用者对存储库保存方法等待:

    public async Task<ActionResult> AddCSVData(){

       await Repository.SaveProducts();
    }

我也尝试让 SaveProducts() 方法也成为一个异步任务,但它一直使方法名称以“async”开头 - 每次都给出相同的错误。

【问题讨论】:

    标签: c# csv asynchronous


    【解决方案1】:

    您需要更改函数的签名

    public static void SaveProducts()
    

    public async Task SaveProducts()
    

    然后您的调用函数需要具有异步任务的签名并像这样调用保存函数:

    Task saveTask = SaveProducts();
    //do some logic
    await saveTask;
    

    【讨论】:

    • 我已经这样做了,现在我收到一条错误消息,指出“一个或多个实体的验证失败。有关更多详细信息,请参见 'EntityValidationErrors' 属性”与代码在同一行:await db.SaveChangesAsync( ); .
    猜你喜欢
    • 2017-06-16
    • 2019-11-03
    • 2018-02-02
    • 1970-01-01
    • 2020-02-15
    • 1970-01-01
    • 2019-11-22
    • 1970-01-01
    • 2013-01-06
    相关资源
    最近更新 更多