Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 在.Net Core的后台插入批量数据_Multithreading_Asp.net Core_Asp.net Core Mvc_Asp.net Core Webapi_Background Service - Fatal编程技术网

Multithreading 在.Net Core的后台插入批量数据

Multithreading 在.Net Core的后台插入批量数据,multithreading,asp.net-core,asp.net-core-mvc,asp.net-core-webapi,background-service,Multithreading,Asp.net Core,Asp.net Core Mvc,Asp.net Core Webapi,Background Service,我使用的是.NETCore3.1,我想在后台插入大量数据,所以我不需要http请求“如火如荼”地等待它 所以我尝试了以下代码 公共对象myFunction(){ Task.Factor.StartNew(()=>{ _BulkInsertAsync(日志); }); 返回数据; } 但什么也没发生,数据库中没有保存数据 是在我的数据返回后,我的_上下文和日志将为空,因此进程被归档? 或者有其他方法插入我的数据,不要等待 注意:如果我用发送邮件或任何其他东西替换插入状态,则后台任务将正常工作 已

我使用的是.NETCore3.1,我想在后台插入大量数据,所以我不需要http请求“如火如荼”地等待它

所以我尝试了以下代码

公共对象myFunction(){
Task.Factor.StartNew(()=>{
_BulkInsertAsync(日志);
});
返回数据;
}
但什么也没发生,数据库中没有保存数据 是在我的数据返回后,我的_上下文和日志将为空,因此进程被归档? 或者有其他方法插入我的数据,不要等待

注意:如果我用发送邮件或任何其他东西替换插入状态,则后台任务将正常工作

已解决

谢谢@Peter,我用

Task.Run(async () => await _context.BulkInsertAsync(logs));

这就是我将如何实现它。这假设响应并不重要

public NotImportantResult ProcessBulkData()
{
    myFunctionAsync();
    return new NotImportantResult() 
}  

private static async void myFunctionAsync()
{
    await Task.Factory.StartNew(() => new MyBulkProccessor.BulkInsertAsync(logs));
}

Task.Factory.StartNew
TaskFactory.StartNew
不能接受异步委托(
Func
),因此您应该改用
Task.Run
,它确实具有。您必须对
StartNew
使用
wait wait
Unwrap
来获得与
Run
相同的行为。请阅读


为什么在
BulkInsertAsync
中需要
Task.Factory.StartNew
InternalBeginBulkProcess
不应该是异步的吗?@Peter Csala-我正在删除该部分以避免混淆。我从一个支持异步和非异步操作的类中获取了它。两人都使用了内部部件。这可能会增加这个问题的混乱。您确定
异步无效
吗?
开始新建
将返回一个任务,而该任务未等待,因此您只需生成一个新作业并立即返回。请分享更多详细信息,因为我们不知道上下文的生命周期,我们不知道什么是数据以及数据是如何填充的。\u上下文由构造函数DI使用,所以我在“任务”之前使用它来获取数据并将数据保存到数据库,然后插入批量日志并返回数据,所以我需要尽快返回数据和日志,以便在请求完成并返回数据后继续插入。您是否尝试过
Task.Run(async()=>await\u context.BulkInsertAsync(日志))
StartNew
没有重载,它接受
Func
是的,它正在工作非常感谢你,关键是我必须提到async(),然后等待上下文。BulkInsertAsyncI为未来的读者留下了解决方案的答案。我强烈鼓励你阅读上面提到的博客文章。
public object myFunction(){
    Task.Run(async () => await _context.BulkInsertAsync(logs));
    return data;
}