我有一个名为Repository的类,它处理CSV文件并从解析的值创建对象。
此课程中有两个列表属性:
public static List<Product> ProductsList { get; set; }
public static List<Category> CategoriesList { get; set; }
Repository类中有一个方法,它解析发布的CSV文件,以创建分别在方法内分配给ProductsList
和CategoriesList
的产品和类别列表。
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”开头 - 每次都给出相同的错误。
答案 0 :(得分:1)
您需要更改功能的签名
public static void SaveProducts()
到
public async Task SaveProducts()
您的调用函数需要具有异步任务的签名并调用保存函数,如下所示:
Task saveTask = SaveProducts();
//do some logic
await saveTask;