首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ASP.NET +线程感知非托管应用编程接口

ASP.NET +线程感知非托管应用编程接口
EN

Stack Overflow用户
提问于 2010-06-27 21:14:35
回答 3查看 462关注 0票数 1

我正在考虑一个ASP.NET应用程序,它使用ESENT来实现持久性。

在这一点上,这只是我的爱好项目,所以需求非常灵活。不过,我希望它能在Windows7、Windows2008和2008IIS3.5及更高版本的R2上运行,并使用默认的.NET设置。

在ESENT中,大多数操作都需要打开一个会话对象。文档说:“会话跟踪它在哪个线程上使用,如果在具有打开的事务的多个线程上使用它,它将抛出错误。”API文档提到的是本机线程,而不是托管线程。

我假设打开会话操作的开销相对较大,这就是为什么我不想为每个HTTP请求打开/关闭会话。

最后,这是我的问题。

在执行C#代码的每个本机线程上,如何在asp.net中只初始化/反初始化一次?

下面发布的代码可以为我工作吗?

在使用BeginThreadAffinity方法不断地将asp.net托管线程固定到本机线程时,有什么不好的地方我不知道吗?在IIS负载了一个月而没有一次重启之后,我的会话会不会泄漏?

提前感谢!

代码语言:javascript
运行
复制
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();
    }
}
EN

Stack Overflow用户

回答已采纳

发布于 2010-06-30 04:03:40

一个不错的方法是创建一个会话池,让线程从池中抓取一个会话,然后在完成后返回该会话。会话可以由不同的线程使用,但是如果在事务处于活动状态时在线程之间迁移会话,ESENT将会报错(虽然可以禁用该行为)。

几个使用ESENT的大型服务器应用程序已经采用了会话池方法,并且这种方法对它们很有效。

票数 3
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3127435

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档