在C#.net中管理定时线程

在C#.net中管理定时线程,.net,multithreading,caching,frameworks,.net,Multithreading,Caching,Frameworks,我为这个问题挣扎了一段时间 在我的网站上,用户被要求参加测试。当他提交答案时,我调用一个WCF服务,该服务将他的数据推送到数据库中。这很简单,但随着用户数量的增加,它会变得非常依赖数据库 因此,为了提高性能(避免对DB的大量调用),我有- a。在服务中实现了缓存 b。实现线程(异步工作)-将缓存数据推送到数据库 因此,现在,每当调用保存答案时,它都会将数据存储在服务缓存中。同时,我运行一个线程(因为我只想在用户测试结束时将数据推送到DB一次,并在缓存中添加临时应答数据),然后返回调用,因为我不想

我为这个问题挣扎了一段时间

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

因此,为了提高性能(避免对DB的大量调用),我有-

a。在服务中实现了缓存

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

因此,现在,每当调用保存答案时,它都会将数据存储在服务缓存中。同时,我运行一个线程(因为我只想在用户测试结束时将数据推送到DB一次,并在缓存中添加临时应答数据),然后返回调用,因为我不想让用户一直等待。我运行的线程必须有15分钟的超时。如果用户在15分钟内没有提交任何答案,则应将缓存的结果保存到数据库中。到目前为止,它很简单,并且已经成功地做到了这一点

我被卡住的地方是,如果用户在这15分钟内发送了一些应答,并且向服务发出了一个调用,那么该线程的超时应该重置为下一个15分钟。所以,它有点像线程的滑动计时器

我在谷歌上搜索了很多,但似乎没有办法追踪到一条线索。而且,如果我在每个保存数据请求上创建一个新线程,那么它只会在数据库上复制相同的负载

我觉得如果有某种方法可以跟踪我第一次启动的线程并相应地操作它,我将能够实现所需的事情

请提出意见和建议

带着紧迫感和感谢


SV

你应该回答阿尔宾的问题。无论如何,您可以尝试以下方法:

当用户提交查询(WCF服务调用)时,将调用时间保存在DB或某个全局对象中

在线程超时逻辑中,计算现在和最后一个请求的时间之间的差异。
如果差异大于等于15,则释放线程,保存数据并创建一个新的线程。否则不要释放。

我不知道为什么每次向缓存添加数据时都要打开线程。您不能将数据添加到缓存中,然后:

  • 如果有答案,在缓存中找到数据并保存到数据库

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

  • 对于添加到缓存中的每个数据,都有一个15分钟的计时器,如果数据尚未添加到数据库中,该计时器将唤醒并清理缓存
  • 毫无理由地阻止线程从来都不是一个好主意,如果您正在实现一个服务器,那么您可能应该使用线程池——而阻止线程池线程绝对不是一个好主意


    在任何情况下,您都应该确保DB是您的瓶颈,因为您当前的设计可能会遇到很多麻烦。例如,如果服务器崩溃并且尚未将数据保存到数据库中,该怎么办?

    如何安排线程超时?你会阻止线程15分钟吗?你们确定db写入是你们的瓶颈吗,你们测量过了吗?阿尔宾,到目前为止我一直使用System.Timer类定时器,设置为运行一次。