我正在考虑使用 ESENT 进行持久性的 ASP.NET 应用程序。
目前这只是我的爱好项目,所以要求非常灵活。但是,我希望它可以在具有 .NET 3.5 及更高版本以及默认 IIS 设置的 Windows 7、Windows 2008 和 2008 R2 上运行。
在 ESENT 中,大多数操作都需要您打开一个会话对象。文档说:“会话跟踪它在哪个线程上使用,如果在具有打开事务的多个线程上使用它会抛出错误。” API 文档提到了本机线程,而不是托管线程。
我假设打开会话操作相对昂贵,这就是为什么我不想为每个 HTTP 请求打开/关闭会话。
最后,这是我的问题。
在 asp.net 中,我如何在执行我的 C# 代码的每个本机线程上只初始化/取消初始化一次?
下面发布的代码对我有用吗?
在使用 BeginThreadAffinity 方法将 asp.net 托管线程不断固定到本机线程时,我不知道有什么不好的地方吗?在 IIS 负载一个月后,我的会话是否会泄漏而没有一次重新启动?
提前致谢!
class MySession: IDisposable
{
[ThreadStatic]
private static MySession s_session = null;
public static MySession instance
{
get
{
return s_session ?? ( s_session = new MySession() );
}
}
private MySession()
{
Thread.BeginThreadAffinity();
// Open a new session, store the handle in non-static data member.
}
void IDisposable.Dispose()
{
// Close the session.
Thread.EndThreadAffinity();
}
}