C# windows服务中使用线程的问题

Boogaloo-Jer 2016-08-30 11:45:37
先贴出代码示例:
public partial class Service1 : ServiceBase
{
public Service1()
{
InitializeComponent();
}


protected override void OnStart(string[] args)
{
Process.Start();
}


protected override void OnStop()
{
using (System.IO.StreamWriter sw = new System.IO.StreamWriter("C:\\log.txt", true))
{
sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ") + "Service:Stop.");
}
}

public static class Process
{
public static void Start()
{
ThreadStart start = new ThreadStart(ThreadAction);
Thread th = new Thread(start);
th.IsBackground = true;
th.Start();
}


public static void ThreadAction()
{
while (true)
{
try
{
//do something

}
catch (Exception ex)
{
using (System.IO.StreamWriter sw = new System.IO.StreamWriter("C:\\log.txt", true))
{
sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ") + "Service:Start.错误" + ex.ToString());
}
}
}
}
}
}

问题是:当我在try中执行代码的时候,如果出现错误:比如“远程服务器返回错误: (500) 内部服务器错误。”或者“操作超时”,,他就会不停的记录日志,每秒钟都记录很多很多!!!导致日志文件没几天就变得很大!!!!!!求前辈们指教!!!这个问题怎么解决?????
...全文
1043 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
Boogaloo-Jer 2017-01-22
  • 打赏
  • 举报
回复
引用 16 楼 qq_25095899 的回复:
[quote=引用 8 楼 gaiyi09 的回复:] [quote=引用 6 楼 sp1234 的回复:] [quote=引用 5 楼 gaiyi09 的回复:] [quote=引用 4 楼 dongxinxi 的回复:] 谁让你没事写什么whlie(true) 主要是设计上你就没考虑,某个时候别人站点都已经宕机或者你的网络出问题了,你还在死循环继续请求后面的页面? 出错了之后也没个错误恢复机制什么的,不管不顾继续搞
对这个东西本来就不会写,这段代码是在网上找的,我在catch中让线程sleep,为什么有时候可用,有时候不可用呢?[/quote] 你如果懒得考虑“设计”,懒得规划蓝图,那就不要自己“设计”程序。找个单位,让单位管理自己,领导让你写什么就写几条语句。[/quote] 你厉害……你站在海拔很高的山顶对山脚下的人喊怎么上来,山脚下的人听得到么![/quote] 别理那个人,他每个回复都是这样,从来不告诉提问者应该怎么做,或者教他为什么那么做,从来都是一幅训导人的口气。 我有几个思路不知道合适不, 1,不管你什么错误,比如“远程服务器返回错误: (500) 内部服务器错误”,这个字符串你肯定能得到,你把他存在缓存里,自己设定一个机制,比如N分钟之类如果出现了M次,那么就不在记录日志了,只在日志里记录最近一次发生的时间和次数,这样你日志就干净了,而且你也能从日志里得知许多信息。 2,如果你的服务器很重要,那么你不能出现过了一两天去看日志才发现其实已经挂了的情况,那么你可以弄个邮件处理的东西,.net自带的mail就可以,当N分钟之类出现M次的情况后马上给你发邮件,让你立刻知道赶快处理。 3,如果你觉得以上很麻烦不想弄,那么你可以这样做,不要以yyyy-MM-dd HH:mm:ss 的方式命名文件,这样每一秒都是一个文件会很多,你以yyyy-MM-dd命名比如2016-9-28-00,一天之内的日志全部记在里面,并且你要设定大小,当这个文件大小超过某个设定值比如5m,的时候另外新建txt , 比如2016-9-28-01 因为文件大了你打开也麻烦,这样你的日志也就少了。不过我建议你还是采取第一种方式。[/quote] 谢谢你的回答。
大然然 2016-09-28
  • 打赏
  • 举报
回复
引用 8 楼 gaiyi09 的回复:
[quote=引用 6 楼 sp1234 的回复:] [quote=引用 5 楼 gaiyi09 的回复:] [quote=引用 4 楼 dongxinxi 的回复:] 谁让你没事写什么whlie(true) 主要是设计上你就没考虑,某个时候别人站点都已经宕机或者你的网络出问题了,你还在死循环继续请求后面的页面? 出错了之后也没个错误恢复机制什么的,不管不顾继续搞
对这个东西本来就不会写,这段代码是在网上找的,我在catch中让线程sleep,为什么有时候可用,有时候不可用呢?[/quote] 你如果懒得考虑“设计”,懒得规划蓝图,那就不要自己“设计”程序。找个单位,让单位管理自己,领导让你写什么就写几条语句。[/quote] 你厉害……你站在海拔很高的山顶对山脚下的人喊怎么上来,山脚下的人听得到么![/quote] 别理那个人,他每个回复都是这样,从来不告诉提问者应该怎么做,或者教他为什么那么做,从来都是一幅训导人的口气。 我有几个思路不知道合适不, 1,不管你什么错误,比如“远程服务器返回错误: (500) 内部服务器错误”,这个字符串你肯定能得到,你把他存在缓存里,自己设定一个机制,比如N分钟之类如果出现了M次,那么就不在记录日志了,只在日志里记录最近一次发生的时间和次数,这样你日志就干净了,而且你也能从日志里得知许多信息。 2,如果你的服务器很重要,那么你不能出现过了一两天去看日志才发现其实已经挂了的情况,那么你可以弄个邮件处理的东西,.net自带的mail就可以,当N分钟之类出现M次的情况后马上给你发邮件,让你立刻知道赶快处理。 3,如果你觉得以上很麻烦不想弄,那么你可以这样做,不要以yyyy-MM-dd HH:mm:ss 的方式命名文件,这样每一秒都是一个文件会很多,你以yyyy-MM-dd命名比如2016-9-28-00,一天之内的日志全部记在里面,并且你要设定大小,当这个文件大小超过某个设定值比如5m,的时候另外新建txt , 比如2016-9-28-01 因为文件大了你打开也麻烦,这样你的日志也就少了。不过我建议你还是采取第一种方式。
Boogaloo-Jer 2016-09-24
  • 打赏
  • 举报
回复
引用 13 楼 xuanbg 的回复:
[quote=引用 10 楼 abcd198910116112 的回复:] 换个号。。。。对于这段代码有些地方不是很明白,我自己在写好之后安装服务后测试,在catch中写入错误日志,然后在catch中让线程sleep,测试时是sleep十秒,我看是可行的,日志就是在每十秒记了一条错误信息,可是在正式环境下,catch中线程sleep就不好用了,从日志中看,有时候可以,有时候不行。在try中所做的是从另一个服务器中抓取数据,由于数据量较多,有时候会出现超时的情况,winsows服务每五分钟执行一次,超时的时候代码会进到catch,所以我没让线程在catch中sleep, 代码会继续循环进入try,直到成功抓到数据,线程sleep……五分钟后再次执行。如果我去掉循环,可能执行一次,出现错误就等待下次了,而数据没取到。。。下次再次失败,还是没取到……这个情况怎么设计才好?
好吧,刚才没看到这个。。。 从你贴的代码看,整个流程是这样的: 1、启动Windows服务 2、服务在启动时开了一个线程 3、这个线程里面无限循环去抓数据,如果抓取失败,则记录失败日志 所以呢,失败了你sleep线程是没用的,你需要解决的问题是想办法不要超时!不要超时!!不要超时!!! 数据量比较大,可以分批抓!!!每次抓10000条数据会超时的话,就分10次,每次只抓1000条,还超时的话就分100次,每次抓100条。总之,可以在1分钟内抓回来数据应该就不会超时了吧。[/quote] 谢谢您的耐心回答。这个抓取数据不止是一张表和很多的数据,是多张表,并且在抓取数据的时候还做了许多的业务处理。鄙人水平浅薄,实在想不出好的办法来,我在catch中加了对于超时情况的代码处理,不让它记录超时的log,这样就不会再一秒钟记录那么多错误信息了。没能根本的处理问题,暂时用了windows计划任务处理了。
software_artisan 2016-09-05
  • 打赏
  • 举报
回复
补充:似乎无论抓成功还是抓失败都会继续重新抓???
software_artisan 2016-09-05
  • 打赏
  • 举报
回复
引用 10 楼 abcd198910116112 的回复:
换个号。。。。对于这段代码有些地方不是很明白,我自己在写好之后安装服务后测试,在catch中写入错误日志,然后在catch中让线程sleep,测试时是sleep十秒,我看是可行的,日志就是在每十秒记了一条错误信息,可是在正式环境下,catch中线程sleep就不好用了,从日志中看,有时候可以,有时候不行。在try中所做的是从另一个服务器中抓取数据,由于数据量较多,有时候会出现超时的情况,winsows服务每五分钟执行一次,超时的时候代码会进到catch,所以我没让线程在catch中sleep, 代码会继续循环进入try,直到成功抓到数据,线程sleep……五分钟后再次执行。如果我去掉循环,可能执行一次,出现错误就等待下次了,而数据没取到。。。下次再次失败,还是没取到……这个情况怎么设计才好?
好吧,刚才没看到这个。。。 从你贴的代码看,整个流程是这样的: 1、启动Windows服务 2、服务在启动时开了一个线程 3、这个线程里面无限循环去抓数据,如果抓取失败,则记录失败日志 所以呢,失败了你sleep线程是没用的,你需要解决的问题是想办法不要超时!不要超时!!不要超时!!! 数据量比较大,可以分批抓!!!每次抓10000条数据会超时的话,就分10次,每次只抓1000条,还超时的话就分100次,每次抓100条。总之,可以在1分钟内抓回来数据应该就不会超时了吧。
software_artisan 2016-09-05
  • 打赏
  • 举报
回复
楼主这个写法真是。。。。。。粗暴!既然这么粗暴,那么就让硬盘默默地挨操吧,log4net也拯救不了它的。 出错了为什么不停下来呢?或者设计一些容错的逻辑,跳过错误数据不去处理不好么?
Polymorphic_type 2016-09-05
  • 打赏
  • 举报
回复
用log4net这个东西,很简单,很好用。。。。。
abcd198910116112 2016-09-02
  • 打赏
  • 举报
回复
换个号。。。。对于这段代码有些地方不是很明白,我自己在写好之后安装服务后测试,在catch中写入错误日志,然后在catch中让线程sleep,测试时是sleep十秒,我看是可行的,日志就是在每十秒记了一条错误信息,可是在正式环境下,catch中线程sleep就不好用了,从日志中看,有时候可以,有时候不行。在try中所做的是从另一个服务器中抓取数据,由于数据量较多,有时候会出现超时的情况,winsows服务每五分钟执行一次,超时的时候代码会进到catch,所以我没让线程在catch中sleep, 代码会继续循环进入try,直到成功抓到数据,线程sleep……五分钟后再次执行。如果我去掉循环,可能执行一次,出现错误就等待下次了,而数据没取到。。。下次再次失败,还是没取到……这个情况怎么设计才好?
Boogaloo-Jer 2016-09-02
  • 打赏
  • 举报
回复
引用 3 楼 meiguo520 的回复:
学会用log4net 这个组件吧 少年。 这个组件可以覆盖前面的错误日志。 你这种记录方法,硬盘都给你沾满了。
学习一下,谢谢。
Boogaloo-Jer 2016-09-02
  • 打赏
  • 举报
回复
引用 6 楼 sp1234 的回复:
[quote=引用 5 楼 gaiyi09 的回复:] [quote=引用 4 楼 dongxinxi 的回复:] 谁让你没事写什么whlie(true) 主要是设计上你就没考虑,某个时候别人站点都已经宕机或者你的网络出问题了,你还在死循环继续请求后面的页面? 出错了之后也没个错误恢复机制什么的,不管不顾继续搞
对这个东西本来就不会写,这段代码是在网上找的,我在catch中让线程sleep,为什么有时候可用,有时候不可用呢?[/quote] 你如果懒得考虑“设计”,懒得规划蓝图,那就不要自己“设计”程序。找个单位,让单位管理自己,领导让你写什么就写几条语句。[/quote] 你厉害……你站在海拔很高的山顶对山脚下的人喊怎么上来,山脚下的人听得到么!
Boogaloo-Jer 2016-09-02
  • 打赏
  • 举报
回复
引用 2 楼 FoxDave 的回复:
做个计划任务定时删除log
不错不错,不用费脑考虑修改代码,能解决问题的方法就是好方法……
  • 打赏
  • 举报
回复
引用 5 楼 gaiyi09 的回复:
[quote=引用 4 楼 dongxinxi 的回复:] 谁让你没事写什么whlie(true) 主要是设计上你就没考虑,某个时候别人站点都已经宕机或者你的网络出问题了,你还在死循环继续请求后面的页面? 出错了之后也没个错误恢复机制什么的,不管不顾继续搞
对这个东西本来就不会写,这段代码是在网上找的,我在catch中让线程sleep,为什么有时候可用,有时候不可用呢?[/quote] 你如果懒得考虑“设计”,懒得规划蓝图,那就不要自己“设计”程序。找个单位,让单位管理自己,领导让你写什么就写几条语句。
Boogaloo-Jer 2016-09-02
  • 打赏
  • 举报
回复
引用 4 楼 dongxinxi 的回复:
谁让你没事写什么whlie(true) 主要是设计上你就没考虑,某个时候别人站点都已经宕机或者你的网络出问题了,你还在死循环继续请求后面的页面? 出错了之后也没个错误恢复机制什么的,不管不顾继续搞
对这个东西本来就不会写,这段代码是在网上找的,我在catch中让线程sleep,为什么有时候可用,有时候不可用呢?
Kai-3 2016-08-31
  • 打赏
  • 举报
回复
可以按时间删除,比如只保留7天的日志
  • 打赏
  • 举报
回复
谁让你没事写什么whlie(true) 主要是设计上你就没考虑,某个时候别人站点都已经宕机或者你的网络出问题了,你还在死循环继续请求后面的页面? 出错了之后也没个错误恢复机制什么的,不管不顾继续搞
扬眉剑出鞘Gu 2016-08-31
  • 打赏
  • 举报
回复
学会用log4net 这个组件吧 少年。 这个组件可以覆盖前面的错误日志。 你这种记录方法,硬盘都给你沾满了。
Justin-Liu 2016-08-31
  • 打赏
  • 举报
回复
做个计划任务定时删除log

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧