【问题标题】:Managing timed threads in C#.net在 C#.net 中管理定时线程
【发布时间】:2011-05-21 09:48:28
【问题描述】:

我在这个问题上苦苦挣扎了一段时间。

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

所以,为了提高性能(避免大量调用 DB),我有 -

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

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

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

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

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

我觉得如果有某种方法可以跟踪我最初启动的线程并相应地对其进行操作,我将能够实现所需的目标。

请指教和建议。

带着紧迫感和感谢

SV

【问题讨论】:

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

标签: .net multithreading caching frameworks


【解决方案1】:

你应该回答阿尔宾的问题。不管怎样,你可以试试这个:

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

在线程超时逻辑中计算现在与上次请求时间之间的差异。 如果差值 >= 15 释放线程,保存数据并创建一个新线程。否则不释放。

【讨论】:

    【解决方案2】:

    我不确定我为什么每次将数据添加到缓存时都打开一个线程。您不能只将数据添加到缓存中吗:

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

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

    3. 为每个添加到缓存的数据设置一个 15 分钟的计时器,如果数据尚未添加到数据库,该计时器会唤醒并清理缓存。

    无缘无故阻塞线程绝不是一个好主意,如果您正在实现服务器,您可能应该使用 ThreadPool - 而阻塞 ThreadPool 线程绝对不是一个好主意。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-11
      • 1970-01-01
      • 2016-07-27
      • 1970-01-01
      • 2013-02-11
      • 2012-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多