NHibernate放在异步函数里报Flush during cascade is dangerous错误问题

编程入门 行业动态 更新时间:2024-10-06 04:10:39

NHibernate<a href=https://www.elefans.com/category/jswz/34/1761492.html style=放在异步函数里报Flush during cascade is dangerous错误问题"/>

NHibernate放在异步函数里报Flush during cascade is dangerous错误问题

如题所示,NHibernate对象不能放在异步函数里,否则可能会报Flush during cascade is dangerous的错误。说可能,是因为不一定每次都报错,可能10次有4、5次报错。(这种错误更令人抓狂)。

原因是,NHibernate并非线程安全,如果两个线程同时使用同一个会话(Session),容易出现不可预知的后果。因此要避免将NHibernate对象或操作放在异步函数里。比如

//一个异步函数
public async Task<int> DoSave(Yb_Hl_Base_Zh zh)
{Delete(zh.CheckResults);//删除var check = new Check_Hl_Base_Zh{...};if (check_Hl_Base_ZhRepository.Add(check)) return 1; else return 0;//新增
}//调用该函数
unitOfWork.Begin();//开启事务
await DoSave(zh);
unitOfWork.Commit();//提交事务

多线程情况下,读取数据库没什么问题,增删改就很可能出现问题。


20230712
又一个鲜活的例子

List<Yb_Cx_Base_Tbt> szs = new List<Yb_Cx_Base_Tbt>();//获取所有的数据来源(浮标、海洋站等)
Dictionary<string, Meta> sources = getSources();foreach(string f in files)
{Yb_Cx_Base_Tbt sz = dlgGetFileData(unit, f, sources);szs.Add(sz);
}
//var tasks = files.Select(f =>
//{//每个文件对应一个来源的数据
//    return Task.Factory.StartNew(() =>
//    {
//        Yb_Cx_Base_Tbt sz = dlgGetFileData(unit, f, sources);
//        szs.Add(sz);
//    });
//}).ToArray();
//Task.WaitAll(tasks);return szs;

以上代码中,注释的这些不行,老老实实换成了上面的循环,一个个来。

更多推荐

NHibernate放在异步函数里报Flush during cascade is dangerous错误问题

本文发布于:2024-03-13 14:43:27,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1734203.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:放在   函数   错误   NHibernate   dangerous

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!