求一个方案(.Net)

Chris_Lim 2011-05-10 12:58:58
后台有一个操作,通过前台界面设置这个操作的执行:可以设置一个具体的时间点,时间到了以后执行这个操作;可以设置时间间隔,达到时间间隔的时候就执行这个操作。

我是这么想的:通过一张表来保存执行这个操作的的一些配置信息。如时间点、时间间隔,后台跑一个Windows服务。在Windows服务中通过Timmer根据配置信息来执行这个操作。问题是:假设现在配置信息已经保存到表中了,这个时候启动Windows服务的话,能按照想要的来运行;但现在如果更改了配置,如何通知Windows服务去重新读取新的配置呢?

知道的给的思路哈,或者说说自己的想法一起探讨下。
...全文
308 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
honghe1 2011-08-16
  • 打赏
  • 举报
回复
Windows服务有一个OnCommand事件,是可以被外面去呼叫的。

System.ServiceProcess.ServiceController s = new System.ServiceProcess.ServiceController("EnsureWebImportWCF");
/*
* The windwos services custom command must be in(128,255)
* Fuck Microsoft!
*/
s.ExecuteCommand(200);
GavinKeng 2011-08-15
  • 打赏
  • 举报
回复
学习 学习
Architecture Net 2011-08-15
  • 打赏
  • 举报
回复
"后台有一个操作,通过前台界面设置这个操作的执行:可以设置一个具体的时间点,时间到了以后执行这个操作;可以设置时间间隔,达到时间间隔的时候就执行这个操作"

方案:后台写一个Windows服务内部使用Timer控件来定时执行操作,在这个Windows服务内部增加一个App.Config文件增加一些key值存储开始执行操作时间点和时间间隔等。在你前台界面配置保存的时候将配置结果保存到相应的windows服务生产的配置单中,然后前台页面调用一个bat文件停止服务,然后重启服务。即可将你配置的时间点和时间间隔来运行Windows服务。
lgm9128 2011-08-12
  • 打赏
  • 举报
回复
关键还在于你这个后台的这个操作是一种什么样的?如果是统计什么,可以用数据库的作业就可以了,时间可以自己设置,不用这么麻烦
如果是单独调用一个独立的执行文件,可以在更改完配置信息后,然后重新启动这个执行程序就可以,重新启动就会重新获取配置
wangping_li 2011-08-05
  • 打赏
  • 举报
回复
修改间隔时间提供一个小工具,修改成功后(并且时间值与之前不一样),那么重启下服务,服务在启动的时候,读取配置文件的执行时间,这样服务就省了一个timer一直侦控时间有没有改变,因为对服务来说,他需要执行的间隔时间是已经存在的,而不是一直要去监控你,相反,你修改了执行时间,有理由去通知服务
xiaodstyle 2011-08-04
  • 打赏
  • 举报
回复
客户端和服务器端的通讯方式根据你的服务器情况决定,如果在一个服务器上,甚至一个应用程序池里,可以用缓存通讯。如果是在一台机器上的两个服务或者是在两个服务器上可以用WCF,REMOTING,TCP,HTTP都可以。
xiaodstyle 2011-08-04
  • 打赏
  • 举报
回复
思路1:定时查询数据库,由于定时执行事件可能对执行要求精确度比较高,造成数据库压力比较大,因此这种方案对数据库压力比较大。较少的数据,较好的数据库资源的情况下,这种方式最简单。

思路2:服务器保存最近一个或者几个需要同时执行的任务,定时检查当前事件是否到执行事件就可以了。当有一个新任务的时候,先和已经保存的时间进行比较,先于已经保存的内容执行时,则修改内存中保存的最近事务。这种思路对数据库的压力大大减少,但是编写逻辑稍微复杂一些。随着任务的增加,如果时间比较密集,则对数据库的压力会随之增加。好处是避免了不必要的查询。

思路3:建立一个任务链表,每次的任务都在链表中找到合适的时间节点,同时指向下一个任务。执行顺序链表的存储可以是文件的也可以数据库的。这样完全没有数据库的查询。此方案为思路2的优化版本。
Kshatriya 2011-08-01
  • 打赏
  • 举报
回复
remoting远程注册+观察者模式。
deepmist 2011-06-13
  • 打赏
  • 举报
回复
用计划任务吧
zxuemei 2011-06-13
  • 打赏
  • 举报
回复
高有高招
qq598235031 2011-06-08
  • 打赏
  • 举报
回复
这问题太简单了,把必要的信息存在库表里或XML,只要库表或XML修改了,就通知服务,配置修改了,服务做些逻辑处理,该干什么去干什么不就了结了。
如果是windows,可以启用一个线程专门做这件事。
ycproc 2011-06-08
  • 打赏
  • 举报
回复
window services也是一个进程

你想做什么
它都能在服务里面调用

shangwg 2011-05-20
  • 打赏
  • 举报
回复
提供一个思路:
服务器上开一个进程,其实可以在你iis中也行,前台每一次操作,iis中一般都会做相关处理,此时如果需要,计算下一次触发的时间,将时间通知该进程。进程判断是否更改触发时间,以最早为准,同时记录到数据库。
进程触发时,再去查数据库,处理该处理的内容,处理完,启动下一个最早触发时间。
这是负载较小的方式,实时也能做到,健壮性也好一些。

另一种就是内存中间触发序列,用多线程去处理。
我们系统用的是前一种,在系统意外挂了之后,重起,能不破坏整个逻辑。
FAST_Michael 2011-05-20
  • 打赏
  • 举报
回复
后台跑一个windows服务,隔一小时查下数据库,执行你自己要的操作,我觉得这是最简单的方法了。SqlDependency也能用,但有局限性,就是要执行SqlCommand才能得到通知
jinxing71 2011-05-12
  • 打赏
  • 举报
回复
前台应该一种通知的机制,告诉后台,我更新了。你自己去获取数据。然后按照新数据来执行。
Chris_Lim 2011-05-11
  • 打赏
  • 举报
回复
我不光要把变化的数据记录下来,还得在数据变化的时候执行我自己的操作,能做到吗?[Quote=引用 3 楼 isjoe 的回复:]

引用 2 楼 chris_lim 的回复:
那时间设置成多少才合适呢?如果你设置的时间间隔比配置中的间隔大怎么办?

引用 1 楼 xuexiaodong2009 的回复:

可以每隔一段事件读取一次数据库
不要做成Windows服务,不就知道什么时间做了改变吗?


。Net类库中缓存类,当sql表改变的时候,自动刷新缓存表。
C# code

//启用更改通知
……
[/Quote]
isjoe 2011-05-11
  • 打赏
  • 举报
回复

以下内容摘自msdn

SqlCacheDependency 类在所有受支持的 SQL Server 版本 (7.0, 2000, 2005) 上监视特定的 SQL Server 数据库表,以便在该表发生更改时,自动从 Cache 中删除与该表关联的项。

数据库表发生更改时,将自动删除缓存项,并向 Cache 中添加新版本的项。
在使用 SQL Server 2005 数据库时,SqlCacheDependency 类还支持与 System.Data.SqlClient.SqlDependency 类进行集成。使用 SQL Server 2005 的查询通知机制来检测使 SQL 查询结果无效的数据更改。与 SQL 查询关联的任何缓存项都将从 System.Web.Caching.Cache 中移除。

在使用 SQL Server 2005 时,可以使用 SqlCacheDependency 类向应用程序的 Cache 添加依赖于 SQL Server 数据库表或 SQL 查询的项。还可以将此类与 @ OutputCache 指令一起使用,以生成依赖于 SQL Server 数据库表的输出缓存的页或用户控件。最后,在使用 SQL Server 2005 时,可以将 SqlCacheDependency 类与 @ OutputCache 页指令一起使用,以生成依赖于 SQL 查询结果的输出缓存的页。对于用户控件,@ OutputCache 指令不支持使用 SQL Server 2005 的查询通知。


isjoe 2011-05-11
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 chris_lim 的回复:]
我不光要把变化的数据记录下来,还得在数据变化的时候执行我自己的操作,能做到吗?

引用 3 楼 isjoe 的回复:

引用 2 楼 chris_lim 的回复:
那时间设置成多少才合适呢?如果你设置的时间间隔比配置中的间隔大怎么办?

引用 1 楼 xuexiaodong2009 的回复:

可以每隔一段事件读取一次数据库
不要做成Windows服务,不就知道什么时间做了改变……
[/Quote]


Insert函数有一个重载,可以在数据库表改变的时候处罚你的调用事件,请参阅msdn
当数据库表改变时候,缓存将被移除,移除的时候会触发你的回调函数,见下面

public void Insert (
string key,
Object value,
CacheDependency dependencies,
DateTime absoluteExpiration,
TimeSpan slidingExpiration,
CacheItemPriority priority,
CacheItemRemovedCallback onRemoveCallback
)

C++
public:
void Insert (
String^ key,
Object^ value,
CacheDependency^ dependencies,
DateTime absoluteExpiration,
TimeSpan slidingExpiration,
CacheItemPriority priority,
CacheItemRemovedCallback^ onRemoveCallback
)

J#
public void Insert (
String key,
Object value,
CacheDependency dependencies,
DateTime absoluteExpiration,
TimeSpan slidingExpiration,
CacheItemPriority priority,
CacheItemRemovedCallback onRemoveCallback
)

JScript
public function Insert (
key : String,
value : Object,
dependencies : CacheDependency,
absoluteExpiration : DateTime,
slidingExpiration : TimeSpan,
priority : CacheItemPriority,
onRemoveCallback : CacheItemRemovedCallback
)



参数
key
用于引用该对象的缓存键。

value
要插入缓存中的对象。

dependencies
该项的文件依赖项或缓存键依赖项。当任何依赖项更改时,该对象即无效,并从缓存中移除。如果没有依赖项,则此参数包含 空引用(在 Visual Basic 中为 Nothing)。

absoluteExpiration
所插入对象将过期并被从缓存中移除的时间。如果使用绝对过期,则 slidingExpiration 参数必须为 NoSlidingExpiration。

slidingExpiration
最后一次访问所插入对象时与该对象过期时之间的时间间隔。如果该值等效于 20 分钟,则对象在最后一次被访问 20 分钟之后将过期并被从缓存中移除。如果使用可调过期,则 absoluteExpiration 参数必须为 NoAbsoluteExpiration。

priority
该对象相对于缓存中存储的其他项的成本,由 CacheItemPriority 枚举表示。该值由缓存在退出对象时使用;具有较低成本的对象在具有较高成本的对象之前被从缓存移除。

onRemoveCallback
在从缓存中移除对象时将调用的委托(如果提供)。当从缓存中删除应用程序的对象时,可使用它来通知应用程序。

static bool itemRemoved = false;
static CacheItemRemovedReason reason;
CacheItemRemovedCallback onRemove = null;

public void RemovedCallback(String k, Object v, CacheItemRemovedReason r){
itemRemoved = true;
reason = r;
}

public void AddItemToCache(Object sender, EventArgs e) {
itemRemoved = false;

onRemove = new CacheItemRemovedCallback(this.RemovedCallback);

if (Cache["Key1"] == null)
Cache.Add("Key1", "Value 1", null, DateTime.Now.AddSeconds(60), TimeSpan.Zero, CacheItemPriority.High, onRemove);
}

public void RemoveItemFromCache(Object sender, EventArgs e) {
if(Cache["Key1"] != null)
Cache.Remove("Key1");
}


cjh200102 2011-05-10
  • 打赏
  • 举报
回复
3楼方式不错
isjoe 2011-05-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 chris_lim 的回复:]
那时间设置成多少才合适呢?如果你设置的时间间隔比配置中的间隔大怎么办?

引用 1 楼 xuexiaodong2009 的回复:

可以每隔一段事件读取一次数据库
不要做成Windows服务,不就知道什么时间做了改变吗?
[/Quote]

。Net类库中缓存类,当sql表改变的时候,自动刷新缓存表。

//启用更改通知
SqlCacheDependencyAdmin.EnableNotifications(BasePage.ConnectionString);
//连接到 SQL Server 数据库并为 SqlCacheDependency 更改通知准备数据库表
SqlCacheDependencyAdmin.EnableTableForNotifications(BasePage.ConnectionString, "xxxxxxxx");
//插入缓存
Cache.Insert("xxxxx", dtMain, new SqlCacheDependency("xxxxx", "xxxxx"));

自己查一下百度吧。
加载更多回复(2)

13,190

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 分析与设计
社区管理员
  • 分析与设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧