private void Form1_Load(object sender, EventArgs e)
{
for (int b = 0; b < 3; b++)
{
Thread thread = new Thread(new ThreadStart(sendMessage));
thread.IsBackground = true;
thread.Name = b.ToString();
thread.Start();
}
} private static void sendMessage()
{
//操作数据库,并通过webservice提交到远程服务器
GetData getdata = new GetData();
Record record = getdata.getNotSendMessage();
if (record != null)
{
....
sendMessage();
}
else
{
Thread.Sleep(5000);
sendMessage();
}
}代码如上,我就是这样类似一个多线程,然后无限循环,不知道为什么!
每次运行时间久了之后(一般是一天时间),程序就会报错,而且报错的貌似还不是代码的异常错误!
错误提示如下:
XXXX 遇到问题需要关闭,我们对此引起的不便表示抱歉...
....
就是这样写无意义提示,任何异常捕捉都没有捕捉到,按关闭按钮程序就关了..
如果是不使用线程运行一个月都不会报错...
private void Form1_Load(object sender, EventArgs e)
{
sendMessage();
}
private static void sendMessage()
{
GetData getdata = new GetData();
Record record = getdata.getNotSendMessage();
if (record != null)
{
....
sendMessage();
}
else
{
//这里用计时器暂停5秒
sendMessage();
}
}但是这样很明显效率低了好多,速度太慢...
向各位求助...
解决方法:
在线程里创建一个新的WebService即可
//操作数据库,并通过webservice提交到远程服务器
GetData getdata = new GetData();
Record record = getdata.getNotSendMessage();
WBService s=new WBService();//创建新的WebService实例
s.test();
每次我都是重新实例化的...
你这个错误有可能是在WebService的并发调用上的错误,也可能是线程并发上的错误,不会是代码错误,因为共用变量出错经常会出现这样的错误 ,
1.确定每个WebService实例是不是完全独立的(不能是静态变量,也不能是全局变量,否则实例就没意义了)
2.是否用到其他的公共变量,比如三个线程都会去操作一个全局的变量或者静态变量,此类操作必须要加上Lock线程锁,保证线程不相互调用产生的冲突,哪怕是一个共用的变量int a++,你也必须锁住
3.是否有回调函数导致整个系统崩溃,多线程的同步回调由于采用同一个内存区域回调,会产生这样的情况,这类情况必须加线程锁,异步回调则无关系
4.线程方法整个内部加try catch,捕捉异常记录,看看是什么错误
这个winform是在服务器上运行的...
2.确实是有两个静态的全局哈希表,但是哈希表的键和值是固定的,只读不写和改的(不知道哈希表能支持多线程同时访问么,如果不行为什么总是运行一段时间后才会出问题,也没有异常捕获到).
3.没有回调函数,只做数据库读取和访问webservice
4.有做异常捕获,但是根本没有任何错误,包括做异常日志记录,发觉就没有查到异常日志....
....
发现有点奇怪的是,每次出现异常的时候都是数据库没有可用数据的时候..大多数是半夜,或者晚上出现问题,那时候基本数据库是没有数据可访问的,也就说每次都是跳过查询数据库和访问webservice...
那就对了,试一下以下操作
public static object objLock=new object();//声明一个全局的锁对象
锁住后操作
lock(objLock)
{
GetData getdata = new GetData();
Record record = getdata.getNotSendMessage();
}
另外,我也不建议用递归,你可以用死循环即可
while(true)
{
//操作
}
private static GetData getdata = new GetData();
private static void sendMessage()
{
while (true)
{
Monitor.Enter(getdata);
Record record = getdata.getNotSendMessage();
Monitor.Exit(getdata);
if (record != null)
{
下面就是对record中的数据操作了
}else
{
Thread.Sleep(5000);
} }
}发现如果用lock需要把整个函数给锁了才可以起作用..
可能是我水平问题...
但是用了Monitor又可以..
我很怀疑就是因为递归引起的问题
{
Thread.Sleep(5000);
sendMessage();
}这样写不知道是个什么意思sendMessage里再执行一次sendMessage
那么他就不会释放上一次执行的数据, 因为他没执行完毕, 所以就导致每5分钟执行一次, 并且不释放内存.
那么执行多次后就会内存太多而发生问题
在没有使用线程的时候运行一个月都没有问题..就是因为使用了线程所以报错了..
现在没有使用递归,改成了while(true)