大家好,我现在遇到一个棘手的问题,用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

解决方案 »

  1.   

    你借鉴一下这个吧
    好像和你的问题相近
    http://www.programfan.com/club/showpost.asp?id=24604
      

  2.   

    应该是并发问题那个dll是你写的吗? 如果你是写的 在里面做好并发控制 防止资源冲突如果不是 那就麻烦了分词不是线程安全的 那你只能在调用他的时候 处理好并发 
    lock(AsyncLock)
    {
      //分词
    }这样效率很低考虑在外面缓存分词结果 例如   中国心  分词为 中国+心
    把这个放到hashtable里面去可以减轻一些分词的压力
      

  3.   

    amandag 我觉的是这个问题我看了C++调用的示例,里面是用多线程调用的,但是我感觉web本身就可以算是一个多线程,我还要用什么方法去多线程打开组件句柄呢?
    按照海量公司的说法是每个用户一个句柄。这该如何是好?
      

  4.   

    问题基本解决。不是组件的问题  是初始化的问题。不同的用户只需要初始化一次组件就可以了,而我的初始化却放在了循环体内,汗。
    解决方案是将初始化代码放在Global.asax的 Application_Start 代码段里
    这样可以保证只有在第一个人进入网站的时候初始化组件,其他人只需要打开句柄,使用,然后关闭就可以了
    本身组件支持多线程,所以就不会有access错误。感谢大家帮忙,每人分一点吧。:)
      

  5.   

    谁写的有例子啊  分词的demo  帮发过来一份参考下谢谢!!!!邮箱[email protected]