我有一个MVC网络应用程序,它与另一个应用程序(非网络)共享一些公共代码。
应用程序必须做的一件事是连接到特定的数据存储。非Web应用程序运行多个线程,每个线程具有一组不同的连接参数,因此公共代码将每个连接标记为“线程静态”。因此,此连接也必须是我的ASP.NET MVC应用程序的线程静态。
在我的网络应用程序中,我使用HttpModule
。 context_BeginRequest
打开连接,begin_EndRequest
关闭连接。 (30秒后数据存储会自动关闭连接,因此我无法无限期地保持打开状态。)
我的网络应用程序似乎工作得很好,除了偶尔它会抛出一个错误,说它无法使用连接。
我通过添加日志来调查这一点。我在每个线程点击context_BeginRequest
,context_EndRequest
以及它抛出异常时记录了每个线程。我发现错误是由我的应用程序中一个从未命中HttpModule's context_BeginRequest
的线程抛出的。因为它没有打到那个,所以没有打开连接。
我的理解是线程应该点击HttpModule
- 所以为什么不呢?
如果我不能保证这种行为,那你会建议采用什么方法?
答案 0 :(得分:0)
这可能是由于在应用程序中的某处使用了异步代码。
异步代码使用回调机制,该机制无法保证在与调用它的代码相同的线程上运行。
您可以将线程同步上下文或简单地将连接本身作为参数传递到异步函数