大家好,我现在遇到一个棘手的问题,用C#调用海量分词的DLL的问题。当多人同时调用DLL,或者多人同时访问页面的时候就会提示
尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.AccessViolationException: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。源错误:
行 64: public static bool SplitWord(uint handle, string text, int option)
行 65: {
行 66: return HLSplitWord(handle, text,option);
行 67: }
行 68: /**//// <summary>获得分词结果个数</summary>
错误。
实在解决不了不知道什么原因。请各位高手帮忙 谢谢谢谢发代码给大家。
下面的代码保存为类文件。
代码很长 您可以打开
http://blog.csdn.net/yeerh/archive/2006/08/04/1018677.aspx
查看类代码
下面的代码保存为aspx.cs文件代码
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Collections;
using System.Collections.Generic;public partial class Default5 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{ }
public void bind()
{
object obj = new object();
lock (obj)
{
int i = 0; //循环变量
uint hh = 0; //分词句柄
int k = 0; //分词参数
bool success; //分词成功标志位 int WordCount = 0; //分词个数
int j = 0; //循环变量
double w = 0.0;
string SingleWord = string.Empty; //单个关键词
//Hashtable hb = GetHashtable(userid);
//SqlDataReader dr = null;
HLSplit.POS WordPos; //词性
List<HLSplit.POS> WordPosList = new List<HLSplit.POS>(8);
WordPosList.Add(HLSplit.POS.D_N);
WordPosList.Add(HLSplit.POS.D_L);
WordPosList.Add(HLSplit.POS.D_I);
WordPosList.Add(HLSplit.POS.D_E);
WordPosList.Add(HLSplit.POS.A_NR);
WordPosList.Add(HLSplit.POS.A_NT);
WordPosList.Add(HLSplit.POS.A_NX);
WordPosList.Add(HLSplit.POS.A_NZ); //定义分词参数
k = (int)(HLSplit.SegOption.POS | HLSplit.SegOption.KEYWORD);
//倒序处理每条搜索结果
for (i = 0; i < 100; i++)
{
//初始化分词组件
if (!HLSplit.HL.Init())
{
HttpContext.Current.Response.Write("初始化分词字典失败!");
HttpContext.Current.Response.End();
}
else
{
//初始化分词句柄
hh = HLSplit.HL.OpenSplit(); }
//分词
string str = "市政无线网络无疑是一个极为前卫的想";
success = HLSplit.HL.SplitWord(hh, str, k);
//成功
if (success)
{
//获取关键词个数,如果大于25,则取前25个
WordCount = (HLSplit.HL.GetKeyCnt(hh) > 25) ? 25 : HLSplit.HL.GetKeyCnt(hh);
w = 0.0; //单个搜索结果的权值总和
for (j = 0; j < WordCount; j++)
{
//获取单个关键词
SingleWord = HLSplit.HL.GetKeyAt(hh, j).word;
//获取该关键词词性
WordPos = HLSplit.HL.GetKeyAt(hh, j).POS;
//判断关键词长度和磁性
if (SingleWord.Length > 1 && SingleWord.Length < 40 && (WordPosList.Contains(WordPos)))
{
Response.Write(SingleWord + "<br>");
}
}
}
HLSplit.HL.CloseSplit(hh);
//HLSplit.HL.Free();
}
}
//}
//HLSplit.HL.Free();
}
protected void Button1_Click(object sender, EventArgs e)
{
bind();
}
}ASPX文件里面就一个按钮其他描述:我的海量分词的三个文件HLSSplit.dll,HLSSplit.lib,HLSSplit.dat全部放在C盘。多人同时点击那个按钮的时候就会出现 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。 的错误请高手帮我解决。谢谢
我说明的不是很清楚,方便的话可以加我QQ细聊。QQ:280180018
尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.AccessViolationException: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。源错误:
行 64: public static bool SplitWord(uint handle, string text, int option)
行 65: {
行 66: return HLSplitWord(handle, text,option);
行 67: }
行 68: /**//// <summary>获得分词结果个数</summary>
错误。
实在解决不了不知道什么原因。请各位高手帮忙 谢谢谢谢发代码给大家。
下面的代码保存为类文件。
代码很长 您可以打开
http://blog.csdn.net/yeerh/archive/2006/08/04/1018677.aspx
查看类代码
下面的代码保存为aspx.cs文件代码
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Collections;
using System.Collections.Generic;public partial class Default5 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{ }
public void bind()
{
object obj = new object();
lock (obj)
{
int i = 0; //循环变量
uint hh = 0; //分词句柄
int k = 0; //分词参数
bool success; //分词成功标志位 int WordCount = 0; //分词个数
int j = 0; //循环变量
double w = 0.0;
string SingleWord = string.Empty; //单个关键词
//Hashtable hb = GetHashtable(userid);
//SqlDataReader dr = null;
HLSplit.POS WordPos; //词性
List<HLSplit.POS> WordPosList = new List<HLSplit.POS>(8);
WordPosList.Add(HLSplit.POS.D_N);
WordPosList.Add(HLSplit.POS.D_L);
WordPosList.Add(HLSplit.POS.D_I);
WordPosList.Add(HLSplit.POS.D_E);
WordPosList.Add(HLSplit.POS.A_NR);
WordPosList.Add(HLSplit.POS.A_NT);
WordPosList.Add(HLSplit.POS.A_NX);
WordPosList.Add(HLSplit.POS.A_NZ); //定义分词参数
k = (int)(HLSplit.SegOption.POS | HLSplit.SegOption.KEYWORD);
//倒序处理每条搜索结果
for (i = 0; i < 100; i++)
{
//初始化分词组件
if (!HLSplit.HL.Init())
{
HttpContext.Current.Response.Write("初始化分词字典失败!");
HttpContext.Current.Response.End();
}
else
{
//初始化分词句柄
hh = HLSplit.HL.OpenSplit(); }
//分词
string str = "市政无线网络无疑是一个极为前卫的想";
success = HLSplit.HL.SplitWord(hh, str, k);
//成功
if (success)
{
//获取关键词个数,如果大于25,则取前25个
WordCount = (HLSplit.HL.GetKeyCnt(hh) > 25) ? 25 : HLSplit.HL.GetKeyCnt(hh);
w = 0.0; //单个搜索结果的权值总和
for (j = 0; j < WordCount; j++)
{
//获取单个关键词
SingleWord = HLSplit.HL.GetKeyAt(hh, j).word;
//获取该关键词词性
WordPos = HLSplit.HL.GetKeyAt(hh, j).POS;
//判断关键词长度和磁性
if (SingleWord.Length > 1 && SingleWord.Length < 40 && (WordPosList.Contains(WordPos)))
{
Response.Write(SingleWord + "<br>");
}
}
}
HLSplit.HL.CloseSplit(hh);
//HLSplit.HL.Free();
}
}
//}
//HLSplit.HL.Free();
}
protected void Button1_Click(object sender, EventArgs e)
{
bind();
}
}ASPX文件里面就一个按钮其他描述:我的海量分词的三个文件HLSSplit.dll,HLSSplit.lib,HLSSplit.dat全部放在C盘。多人同时点击那个按钮的时候就会出现 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。 的错误请高手帮我解决。谢谢
我说明的不是很清楚,方便的话可以加我QQ细聊。QQ:280180018
解决方案 »
- jmail下载邮件附件问题
- 这句sql怎么改写成linq to sql急...
- 关于Asp.Net文件夹的访问权限问题
- C# 从excel中读出数据,然后把数据插入到数据库中,怎么办?
- web service中的状态保持问题
- image.src="....",服务器端是一个Bmp文件,该怎么写Response,把这个BMP文件返回给客户端呢?
- 求助:在查询超过1万的数据,大家都是怎么解决的?
- 怎么操作sybase数据库啊?大家有没有例子?
- 局域网是通的,ie上不去网,怎么会事?
- 对外公开的http接口,公开一个入口和公开多个入口,对性能的影响
- 请教, 这个错误 Exception message: Path 'OPTIONS' is forbidden. 怎么解决?
- 100分紧急求救!!!C#中操作EXCEL问题,在线等,有正确答案就结贴
好像和你的问题相近
http://www.programfan.com/club/showpost.asp?id=24604
lock(AsyncLock)
{
//分词
}这样效率很低考虑在外面缓存分词结果 例如 中国心 分词为 中国+心
把这个放到hashtable里面去可以减轻一些分词的压力
按照海量公司的说法是每个用户一个句柄。这该如何是好?
解决方案是将初始化代码放在Global.asax的 Application_Start 代码段里
这样可以保证只有在第一个人进入网站的时候初始化组件,其他人只需要打开句柄,使用,然后关闭就可以了
本身组件支持多线程,所以就不会有access错误。感谢大家帮忙,每人分一点吧。:)