今天从Intel博客里面看到了这篇文章还不错,记录下来
1) 不要在线程函数体内操作MFC控件,不要再线程里面调用UpdateData函数更新用户界面,而应该尽量采用发送消息的方式,在主线程的消息响应函数中操作控件;
2)不建议采用SendMessage往主线程发送消息,因为它是同步的,阻塞的,可以考虑采用PostMessage代替;
3)线程退出时,尽量不要使用TerminateThread函数,而尽可能的让线程自己退出;
4) 当线程退出时,必须先等待工作者线程退出,主线程才退出,但是在主线程里面不要使用WaitForSingleObject或 WaitForMultiObjects等待线程结束,因为它可能造成死锁,当主线程使用这两个函数时,主线程就挂起了,尤其在第 (1), (2) 种情况下,工作者线程还在调用主线程里面的资源,这样造成死锁;
5) 为了防止退出死锁的发生,尽量使用MsgWaitForMultipleObjects函数,因为该函数等待时,可以等待线程句柄 有信号,而且还可以等待消息,不会造成死锁;
原文地址:http://software.intel.com/zh-cn/blogs/2011/08/03/windows-2/?cid=sw:prccsdn1945
公司有一个文档库,因为同事提交的文档要进行权限和内容的处理,所以之前搭建此功能的同事在此文档库里面加入了EventHandler事件处理。这个文档库主要工作都是集中到每个月的几天,导致这几天都要经常重启IIS或者服务器。只能去查看源代码了。
在查看源代码的过程中,没有发现有什么问题出现。只能通过EventHandler调试方式来进行源代码的调试(EventHandle调试方式网上找的),进行调试的时候发现,在进行权限处理之前的SPListItem的获取很慢,都要20秒左右(此文档库里面有3万多的文档),红色的代码为出问题的地方,代码如下:
SPSecurity.RunWithElevatedPrivileges(delegate()
{
using (SPSite Site = new SPSite(properties.SiteId))
{
using (SPWeb Web = Site.OpenWeb(properties.OpenWeb().ID))
{
StringBuilder sb = new StringBuilder();
SPList List = Web.Lists[properties.ListId];
SPListItem Item = List.Items.GetItemById(properties.ListItemId);
SPRoleDefinition Read = Web.RoleDefinitions["读取"];
SPRoleDefinition Create = Web.RoleDefinitions["创建"];
SPRoleDefinition Delete = Web.RoleDefinitions["删除"];
SPRoleDefinition Edit = Web.RoleDefinitions["编辑"];
SPUser Author = Utility.GetFieldUser(item, "创建者");
SPRoleAssignment Ra = new SPRoleAssignment(Web.EnsureUser(Author.LoginName));
if (!Item.HasUniqueRoleAssignments) Item.BreakRoleInheritance(false);
Ra.RoleDefinitionBindings.Add(Read);
Ra.RoleDefinitionBindings.Add(Create);
Ra.RoleDefinitionBindings.Add(Delete);
Ra.RoleDefinitionBindings.Add(Edit);
Item.RoleAssignments.Add(Ra);
}
}
});
查找了许多资料也没有找出是什么原因,后来想到SharePoint的文档都是存放在数据库里面的,这个文档库有3万多个文档,GetItemById(properties.ListItemId) 就相当于 使用Where通过ID条件来查询出这个文档。那么SPList.Items.GetItemById中的SPList.Items是否是将此列表的所有文档3万多条记录都读取出来,有这个想法主要是可以使用 SPListItemCollection item = SPList.Items 来处理所有文档。如果这个成立的话那么慢的原因就出来了,此语句的操作是:先将这个文档库的所有Select出来再通过ID来读取我们想要的Item。
那么是否有直接通过ID条件来获取Item的API吗,试一下,真是内牛满面,真有一个SPList.GetItemById 这个方法,试了一下,天呀。什么叫提高效率,这才叫提高效率,原本处理完11个文档要3分钟40秒即(220秒)而现在只要(3秒)。神马都是浮云。这是多少倍:220%3=73.333。天呀。怪不得,怪不得偶要累了一个月。
偶晚上就给她更新到生产环境看看是否会再出重启IIS问题,同时因为我只学习了二个月的SharePoint,且主要都是在处理各种原来存在的Bug,所以我们理解就是这样,希望大家看到后可以给我一些明确的指导。在此先谢谢了!
在一台服务器上安装了SharePoint 2007 X86 简体中文版本后,将其卸载后。再次安装完成后,在配置WSS3.0时到了第二步“配置数据库”时出现了以下错误:
未能创建配置数据库。
已引发类型为Microsoft.SharePoint.SPException的异常。其他异常信息:The language is not supported on the server.
导致了Wss3.0没有办法配置成功,重新卸载一遍,并重启后,还是到了这一步出现了问题,回想一下步骤没有问题的还是选择“高级”=》“完整”的形式安装。
因为只有一个人在研究,所以也没有什么认识的人,只能Google了,找了好久才找到一个MSDN里面的英文说明。是因为卸载第一遍后,导致注册表里面少了“ServerLanguage”,对方给出了以下注册表指令
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Shared Tools\Web Server Extensions\12.0\ServerLanguage]
"1033"=""
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Shared Tools\Web Server Extensions\12.0\ServerLanguage]
"2052"=""
修改刚才的aaa.reg 保存后双击导入注册表。再次开始WSS3.0配置。OK,终于可以了。
注:因为刚才出错了,所以要去删除二个数据库,一个是刚才设置的配置数据库和WSS3.0管理中心的数据库(汗,这个每配置一次都不一样的名字,真不知道怎么让他们一样)

