大家好,求救,多线程异常问题,公司催得紧,救命,望高手出手相救
本来没有采用多线程,为了提高页面的某一功能访问速度,就采用多线程让其进行并行,并行的就是这个功能中的两个操作,这个功能会有多个用户进行访问操作。一开始页面还是正常的,但是使用了一段时间后页面就无法正常显示了,结果查看了一下IIS中的应用程序池,发现相应的应用程序池被自动关闭,如果重启应用程序池就好了,但是当系统用户(不止一个用户)用了一段时间后又出现同样的问题。由于在用的时候出现问题,为了不影响公司系统使用,我将使用的页面还原成了无线程的页面,然后又新建了一个网站和应用程序池并用一个测试网页进行测试,因为是系统,就默认了一个用户登陆进行这种操作,前面几次操作都没有问题,当进行第5到6次操作时将出现两类错误。这些错误都是在计算机管理下的事件查看器下的应用程序中查看得到1,错误来源:VsJITDebugger
事件ID: 4096
描述:发生了未处理的异常(“System.Data.OracleClient.OracleException”),发生位置是 w3wp.exe [5832]。 对此异常的实时调试失败,错误为: 未能启动调试器,因为没有用户登录。
发生这个错误虽然显示了oracleclient的问题,但是应该不是数据库的问题,我是打算将其异常写入数据库时会报出,就算不使用数据库写入异常,也会发生未处理的异常,异常又是其他的描述,我个人认为可能是session丢失了,就是用户登陆的那个用户值当操作5次后变空了,但是实在是不知道如何处理
2 ,错误来源:.NET Runtime 2.0
事件ID: 5000
描述:EventType clr20r3, P1 w3wp.exe, P2 6.0.3790.3959, P3 45d6968e, P4 app_code.eba7tejf, P5 0.0.0.0, P6 4a261c54, P7 b5, P8 39, P9 system.data.oracleclient.oracle, P10 NIL.
这就是以上多线程遇到的问题,多线程代码如下
this.StartThread();//开始启动线程
private void StartThread()
{
try
{
ThreadPool.QueueUserWorkItem(new WaitCallback(GetCrm));//运行端口测试
ThreadPool.QueueUserWorkItem(new WaitCallback(GetRadius));//运行RADIUS
while (!(crm_thread && radius_thread))//当线程//未结束时等待
{
Thread.Sleep(100);
}
}
catch (Exception ex)
{
}
}
下面是两个线程函数
//CRM线程
private void GetCrm(object name)
{
if (dr != null)
{
crm_find = "1";
pnl_DSLAM.Visible = true;
DSLAM_bind(dr);
}
else
{
crm_find = "0";
}
crm_thread = true;
}
//Radius线程
private void GetRadius(object name)
{
string searchType = dl_searchType.SelectedValue;//查找类型
string value = txt_value.Text.Trim();//查询条件
string userName = Session["staff_id"].ToString();
string userType = Session["c_userType"].ToString();
radius_find = RADIUS_bind(txt_value.Text, userType, userName);
if (radius_find == "1")//在RADIUS查找成功
{
setView(userName, userType);
}
else //在RADIUS中未找到
{
radius_find = "0";
Pnl_RadiusComm.Visible = false;
Pnl_RadiusCard.Visible = false;
Pnl_RadiusVPDN.Visible = false;
}
radius_thread = true;
}
两个线程函数中没有访问到相同的资源,所以没采用死锁控制,但是多个用户可能访问,不过我这样想,不用多线程的时候,一个用户也算一个主线程,这样都没出现问题,我想应该不是这种问题。
还有就是有的网上说用线程的abort和join等,我都用了,也用了判断线程是否停止及线程状态是running就等待,是stop就退出,可是还是没用,希望各位高手能帮兄弟一把 --------------------编程问答-------------------- --------------------编程问答-------------------- 同情你 可惜帮补上忙 --------------------编程问答-------------------- 厉害啊。。。学习啊!!真是爱莫能助!! --------------------编程问答-------------------- 没看懂啥意思。。。 --------------------编程问答-------------------- 线程里的资源要释放 --------------------编程问答-------------------- 当打开一个ASP.NET页面时,偶尔出现上面的错误,页面是一直打不开,直到超时。
出现之前,其他ASP.NET页面可以打开。出现之后,其他ASP.NET页面也难打开。
这个页面,大多时候是打开正常的,对吗?
简单!小KIS TWO POINTS: Take care!
1.IIS的权限不够!!
2.出现这个问题的原因在于未处理异常的默认策略在 .NET Framework 2.0 中已发生更改。默认情况下,未处理异常的策略是结束工作进程。
在 Microsoft .NET Framework 1.1 和 Microsoft .NET Framework 1.0 中,会忽略托管线程上的未处理异常。除非附加调试程序以捕获异常,否则您可能意识不到出错。
ASP.NET 在 .NET Framework 2.0 中使用未处理异常的默认策略。引发未处理的异常时,基于 ASP.NET 的应用程序将会意外退出。
如果在请求上下文中出现异常,则不会发生上述行为。这类异常仍由 HttpException 对象进行处理和包装。在请求上下文中出现的异常不会导致工作进程结束。但是,请求上下文之外的未处理异常(如计时器线程上或回调函数中的异常)会导致工作进程结束。 --------------------编程问答--------------------
代码几乎是好几个人写的。
crm_find 英文缩写用小写
Pnl_RadiusComm.Visible 英文缩写首字母用小写
pnl_DSLAM.Visible 英文缩写大小写混合
string searchType 声明变量不像前面那样加前缀
=======================
while (!(crm_thread && radius_thread))//当线程//未结束时等待
{
Thread.Sleep(100);
}
你这样跟没有多线程一样,而且更慢。
如果不用异步线程,就无法提高页面的某一功能访问速度。
该功能里面某个步骤要执行1个小时,用户也得傻等。
不如用普通的。
线程出错的话,应该会有VS 的调试对话框出来的,它会定位到具体的代码的。看日志没有什么帮助的。 --------------------编程问答-------------------- 可是vs调试的时候不会出错阿,就是访问网站的时候就会出错,而且也不知道哪出错只有看日志了 --------------------编程问答-------------------- vs调试多少次都不会出错,可是访问网站超过5-6次就有问题了,有没有具体的解决方法呢
补充:.NET技术 , ASP.NET