2010-12-07 104 views
1

我一直在努力解决这个问题。在C#中管理定时线程.net

在我的网站上,用户被要求参加测试。当他提交一个答案时,我会调用一个WCF服务,将他的数据推送到数据库中。这很简单,但随着用户数量的增加,确实会变得数据库密集。

因此,为了提高性能(以避免重调用到DB),我有 -

一个。在服务中实施缓存。

b。实现线程(用于异步工作) - 将缓存数据推送到数据库。

所以,现在,每当有一个呼叫保存答案来了,它在服务缓存存储数据。同时,我运行一个线程(因为我只想将数据推送到数据库一次 - 在用户测试结束时 - 并将临时答案数据添加到缓存中),然后返回该呼叫,因为我不想要用户不断等待。我运行的线程必须有15分钟的超时时间。如果用户在15分钟内未提交任何答案,则应将缓存的结果保存到数据库。直到现在,它很简单,并设法做到这一点。

我在哪里卡住的是,如果用户发送的一些答案,就会调用这些15分钟内的服务进行,该线程超时应复位到下一个15分钟。所以,它的一个线程滑动计时器。

我用Google搜索了很多,但似乎没有办法跟踪线程。而且,如果我在每个保存数据请求上创建一个新线程,那么它只会在数据库上重现相同的负载。

我觉得,如果可能会有一些方法来跟踪我第一次开始线程,并相应地操纵它,我就能达到预期的事情。

请指教并提出建议。

紧迫感和感谢

SV

+1

你如何计划线程超时?你会阻止线程15分钟吗?你确定数据库写入是你的瓶颈,你有没有测量? – 2010-12-07 07:16:50

回答

0

你应该回答阿尔滨的查询。反正你可以试试这个:

当用户提交查询(WCF服务调用),保存DB来电或一些全局对象的时间。

在线程超时逻辑计算从现在到过去的请求的时间的差。 如果差值大于等于15则释放线程,保存数据并创建一个新线程。否则不释放。

0

我不确定我是否明白为什么每次将数据添加到缓存时都要打开一个线程。难道你不能只是将数据添加到缓存中:

  1. 如果答案来了,找到缓存中的数据并保存到数据库。

  2. 每隔一段时间运行一次“清理”线程以查找超过15分钟的缓存中的数据并保存到数据库并清理缓存。

  3. 如果尚未将数据添加到数据库,那么每增加一个数据添加到缓存中,都会有15分钟的计时器唤醒并清除缓存。

这绝不是一个好主意,因为无缘无故地阻塞线程,如果你正在实现一个服务器,你应该使用ThreadPool,并且阻止一个ThreadPool线程绝对不是一个好主意。

无论如何,你应该确保数据库是你的瓶颈,因为你可能会遇到很多麻烦与你目前的设计。例如,如果服务器崩溃并且尚未将数据保存在数据库中呢?