用C#语言写的winform程序,运行一段时间后程序就自动关闭了,给整个事件加上try...catch也无法捕获到异常。在事件管理器中发现如下错误日志:
EventType clr20r3, P1 collect.winform.exe, P2 1.0.0.0, P3 508a69ce, P4 system.windows.forms, P5 2.0.0.0, P6 4f681deb, P7 1521, P8 12f, P9 system.notsupportedexception, P10 NIL.
查阅了相关资料,很有可能是HttpWebRequest的用法引起的,我的代码如下:
1 public static string GetRequestData(string url) 2 { 3 WebRequest request = HttpWebRequest.Create(url); 4 Stream stream = null; 5 WebResponse response = null; 6 MemoryStream stmMemory = new MemoryStream(); 7 byte[] buffer = new byte[64 * 1024]; 8 int i; 9 try 10 { 11 response = request.GetResponse(); 12 stream = response.GetResponseStream(); 13 while ((i = stream.Read(buffer, 0, buffer.Length)) > 0) 14 { 15 stmMemory.Write(buffer, 0, i); 16 } 17 byte[] arraryByte = stmMemory.ToArray(); 18 return Encoding.GetEncoding("utf-8").GetString(arraryByte); 19 } 20 catch (Exception ex) 21 { 22 throw ex; 23 } 24 finally 25 { 26 stream.Close(); 27 stream.Dispose(); 28 response.Close(); 29 stmMemory.Close(); 30 stmMemory.Dispose(); 31 } 32 } 33 34 public static bool DownloadFile(string url, string fileFullpath) 35 { 36 WebRequest request = HttpWebRequest.Create(url); 37 request.Timeout = 6000; 38 WebResponse response =null; 39 Image imgObj = null; 40 try 41 { 42 response = request.GetResponse(); 43 imgObj = Image.FromStream(response.GetResponseStream()); 44 if (!Directory.Exists(fileFullpath.Substring(0,fileFullpath.LastIndexOf("/")))) 45 Directory.CreateDirectory(Directory.GetParent(fileFullpath).FullName); 46 imgObj.Save(fileFullpath); 47 } 48 catch (Exception ex) 49 { 50 throw ex; 51 } 52 finally 53 { 54 response.Close(); 55 if (imgObj != null) imgObj.Dispose(); 56 } 57 return true; 58 }
希望前辈们能够提供以下解决思路,谢谢。
这个你是定时做的吗?
没有用到定时。
@psforever: 不做定时,你的程序只能运行一次,难道你用了无限循环的?
@chenping2008: 我先将采集地址信息都获取到了,全部都放在一个集合中,然后再遍历这个集合,程序一般在运行了大概一天多的时间后就自动关了。
@psforever: 数据量很大,难道是内存吃紧了?不太清楚楼主的程序是如何写的?
@chenping2008: 数据量确实有点大,我之前也怀疑过时内存不够导致的,但是通过我长时间的监视(呵呵,其实就是每隔一段时间看看系统内存使用情况)发现,内存并无大幅度的变化。
我的实现方式基本上就是:我开辟了一个线程用于去采集,首先获取到所有的外层采集链接存入List集合中,然后遍历此集合采集链接页面的数据,然后在遍历采集最里层的链接数据。并且没采集成功一个添加一项数据ListView中。我用全局的Application_ThreadException事件也无法捕获到任何异常,程序在运行一天多的时间后就关闭了。
使用多线程,判断掉了一个再自动开一个线程
但现在关键是我都不知道是具体是哪里出错,我怎么判断“掉了一个”?