我有一个用.NET 3.5(c#)编写的Windows服务,它带有一个System.Threading.Timer,它在每个回调中产生几个Threads.这些只是普通线程(没有线程池),我在每个线程上设置了IsBackground = true,因为我只会运行托管代码.
当用户停止服务时,所有线程会发生什么?他们优雅地死了吗?我没有任何代码通过调用join或abort来管理线程.假设IsBackground = true足以假设线程将在用户停止服务时被处理和停止是否正确?当有人通过Service Manager GUI停止Windows服务时会发生什么?它会在触发OnStop事件后终止进程吗?
这对我来说实际上是可以接受的,因为我已经构建了一个单独的机制,允许用户在停止服务之前确定没有线程.这是通过在Windows服务中运行的ServiceHost公开的2个WCF方法完成的.有一种方法可以停止生成新线程,另一种方法可以查询剩余的运行线程数.
我只是好奇如果他们跳过这些步骤并停止服务会发生什么......似乎IsBackground帮助实现了这个目标:
我正在使用Sql Server 2008并且有一个在内部使用sp_executesql的proc.通过ASP.NET执行proc时,我一直收到以下错误:
对象'MyTable',数据库'MyDatabase',架构'dbo'上的SELECT权限被拒绝.
我已经对此做了大量研究,大多数人都指出我需要在动态查询读取的基础表上授予select权限.好吧,我已经完成了这个,它似乎仍然无法正常工作:
select object_name(major_id) as object,
user_name(grantee_principal_id) as grantee,
user_name(grantor_principal_id) as grantor,
permission_name,
state_desc
from sys.database_permissions
where major_id = object_id('User') and
class = 1
Run Code Online (Sandbox Code Playgroud)
Results: MyTable public dbo SELECT GRANT MyTable guest dbo SELECT GRANT MyTable myuser dbo SELECT GRANT MyTable NT AUTHORITY\NETWORK SERVICE dbo SELECT GRANT
正如你所看到的,我试图在基础表上授予select,这已经过度了.我甚至重新编写了我的proc,以便它只在动态sql中引用MyTable.我甚至已经授予所有上述用户"proc"执行权限...没有运气.
上面的"myuser"是web.config中我的connectionstring中的用户名.
我在这里错过了什么吗?
谢谢!戴夫
我们有大约 7 个运行 .NET Windows 服务的应用程序服务器,它们对单个 sql server 2005 队列表执行 ping 操作,并以固定时间间隔获取固定数量的记录进行处理。要处理的记录量和提取之间的时间量都是可配置的,最初设置为 100 秒和 30 秒。
目前,我的队列表有一个 int status 列,可以是“就绪、处理、完成、错误”。获取记录的过程有一个sql事务,事务内有以下代码:
1)将x条记录提取到临时表中,其中状态为“Ready”。select 使用了 Holdlock 提示
2) 将队列表中这些记录的状态更新为“正在处理”
.NET 服务执行一些处理,每个记录可能需要几秒钟甚至几分钟的时间。每个记录调用另一个过程,它只是将状态更新为“完成”。更新过程没有事务,因为我在这里依靠隐式事务作为更新子句的一部分。
我不知道这方面的流量例外情况,但估计每天会低于 10k 条记录。
这是处理这种情况的最佳方法吗?如果是这样,我是否遗漏了任何细节,例如这里或那里的提示?
谢谢!戴夫
asp.net ×1
dynamic-sql ×1
isbackground ×1
locking ×1
permissions ×1
sql-server ×1
t-sql ×1
wcf ×1