存储库的异步操作,用于将新数据保存到数据库

时间:2017-02-21 16:54:21

标签: c# csv asynchronous

我有一个名为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文件的发布请求时,我收到此错误:

  

此时无法启动异步操作。异步操作只能在异步处理程序或模块中启动,或者在页面生命周期中的某些事件中启动。如果在执行页面时发生此异常,请确保将页面标记为&lt;%@ Page Async =“true”%&gt;。此异常还可能表示尝试调用“异步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”开头 - 每次都给出相同的错误。

1 个答案:

答案 0 :(得分:1)

您需要更改功能的签名

public static void SaveProducts()

public async Task SaveProducts()

您的调用函数需要具有异步任务的签名并调用保存函数,如下所示:

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