List<ErrorModel> errorList = new List<ErrorModel>();
static ManualResetEvent[] ThreadEvent = new ManualResetEvent[10];//线程事件 public void MakeHtmlByThread(out IList<ErrorModel> Errors, IList<PathModel> pathModels)
{ int count = pathModels.Count / 10; for (int i = 0; i < 10; i++) //将任务分发给10个支线程
{
ThreadEvent[i] = new ManualResetEvent(false);
ThreadPool.QueueUserWorkItem(delegate { ToHtml(pathModels.Skip(count * i).Take(count).ToList<PathModel>(), ThreadEvent[i]); });
}
WaitHandle.WaitAll(ThreadEvent); //等待所有支线程结束 Errors = errorList;
} private void ToHtml(IList<PathModel> modelList, ManualResetEvent _theradEvent)
{
foreach (PathModel model in modelList)
{
Stopwatch watch = Stopwatch.StartNew();
try
{
string url = "http://" + Request.UrlReferrer.Authority + Request.ApplicationPath + model.aspxPath;
string html = model.htmlPath;
if (html.EndsWith(".html"))
{
int dot = html.LastIndexOf(".html");
int index = html.LastIndexOf("/") + 1;
string s1 = html.Substring(0, index);
string s2 = html.Substring(index, dot - index);
string fileDir = ZH.FileControl.FileBuild.BuildHtmls(url, Request.PhysicalApplicationPath, s1, s2);
}
}
catch (Exception ex)
{
errorList.Add(new ErrorModel() { errorMsg = Thread.CurrentThread.Name + "号线程执行的任务包含错误:" + ex.Message + ",耗时:" + watch.Elapsed.TotalSeconds + "秒。", id = model.id });
}
} if (null != _theradEvent) _theradEvent.Set();//指示本线程已结束
}
这段代码是用多线程生成静态页面,其中:MakeHtmlByThread方式启动了10个线程,每个,但是ThreadPool.QueueUserWorkItem(delegate { ToHtml(pathModels.Skip(count * i).Take(count).ToList<PathModel>(), ThreadEvent[i]); }此处却每次都提示数组超出索引,我调试看,发现i居然等于10了怎么解决这个问题?是什么原因导致?
而且我发现我只要规规矩矩的按F10单步调试,是不会出现这种问题的,但是我只要正常运行,或者按F5跳过,就会出现这种问题。
是多线程导致的吗?怎么解决?
static ManualResetEvent[] ThreadEvent = new ManualResetEvent[10];//线程事件 public void MakeHtmlByThread(out IList<ErrorModel> Errors, IList<PathModel> pathModels)
{ int count = pathModels.Count / 10; for (int i = 0; i < 10; i++) //将任务分发给10个支线程
{
ThreadEvent[i] = new ManualResetEvent(false);
ThreadPool.QueueUserWorkItem(delegate { ToHtml(pathModels.Skip(count * i).Take(count).ToList<PathModel>(), ThreadEvent[i]); });
}
WaitHandle.WaitAll(ThreadEvent); //等待所有支线程结束 Errors = errorList;
} private void ToHtml(IList<PathModel> modelList, ManualResetEvent _theradEvent)
{
foreach (PathModel model in modelList)
{
Stopwatch watch = Stopwatch.StartNew();
try
{
string url = "http://" + Request.UrlReferrer.Authority + Request.ApplicationPath + model.aspxPath;
string html = model.htmlPath;
if (html.EndsWith(".html"))
{
int dot = html.LastIndexOf(".html");
int index = html.LastIndexOf("/") + 1;
string s1 = html.Substring(0, index);
string s2 = html.Substring(index, dot - index);
string fileDir = ZH.FileControl.FileBuild.BuildHtmls(url, Request.PhysicalApplicationPath, s1, s2);
}
}
catch (Exception ex)
{
errorList.Add(new ErrorModel() { errorMsg = Thread.CurrentThread.Name + "号线程执行的任务包含错误:" + ex.Message + ",耗时:" + watch.Elapsed.TotalSeconds + "秒。", id = model.id });
}
} if (null != _theradEvent) _theradEvent.Set();//指示本线程已结束
}
这段代码是用多线程生成静态页面,其中:MakeHtmlByThread方式启动了10个线程,每个,但是ThreadPool.QueueUserWorkItem(delegate { ToHtml(pathModels.Skip(count * i).Take(count).ToList<PathModel>(), ThreadEvent[i]); }此处却每次都提示数组超出索引,我调试看,发现i居然等于10了怎么解决这个问题?是什么原因导致?
而且我发现我只要规规矩矩的按F10单步调试,是不会出现这种问题的,但是我只要正常运行,或者按F5跳过,就会出现这种问题。
是多线程导致的吗?怎么解决?
解决方案 »
- 一个jquery部分的问题。
- asp连接oracle数据库无法查询
- 求一个重复字符串替换算法!!!
- fckeditor打开图片上传框的时候,变色白色
- Page.RegisterStartupScript()原理?能否和前台js代码交流?
- 命名空间问题
- 吐血放分,请教datagrid分页问题,为什么我点下一页就会出现如下错误?
- asp/asp.net内部对象说明,session,request,..............等等
- 动态加载用户控件与静态加载的区别
- 这么简单的问题,郁闷死了,睡觉前希望达到答案,在线等,多谢谢!!!
- 在.net中怎么使用c#写下载文件代码啊
- 怎样根据url地址判断这个url是来自那个商城的
当i=9 的时候 后边i++ 这样i就等于10了 但是等于10的时候会跳出循环啊
难道没有跳吗
最後推出循環的時候是,1不就是等於10嗎?
private System.Object lockThis = new System.Object();
public void MakeHtmlByThread(out IList<ErrorModel> Errors, IList<PathModel> pathModels)
{
lock (lockThis)
{
int count = pathModels.Count / 10; for (int i = 0; i < 10; i++) //将任务分发给10个支线程
{
ThreadEvent[i] = new ManualResetEvent(false);
ThreadPool.QueueUserWorkItem(delegate { ToHtml(pathModels.Skip(count * i).Take(count).ToList<PathModel>(), ThreadEvent[(i)]); });
} WaitHandle.WaitAll(ThreadEvent); //等待所有支线程结束
} Errors = errorList;
}
还是相同的错误
Thread[] thrads = new Thread[10]; public void MakeHtmlByThread(out IList<ErrorModel> Errors, IList<PathModel> pathModels)
{
StartThread(pathModels);
foreach (Thread t in thrads) t.Join(); Errors = errorList;
} private System.Object lockThis = new System.Object();//此对象用于线程安全锁
public void StartThread(IList<PathModel> pathModels)
{
lock (lockThis)
{
int count = pathModels.Count / 10; for (int i = 0; i < 10; i++) //将任务分发给10个支线程
{
thrads[i] = new Thread(ToHtml);
thrads[i].Start(pathModels.Skip(count * i).Take(count).ToList<PathModel>());
}
}
}