“线程”为什么会自动“Stopped”???

sswp7 2013-01-05 03:36:36
1、主窗体启动,创建处理线程。

private void MainForm_Load(object sender, EventArgs e)
{
Common.etlprocessing = new Processing.ETLProcess();

//启动数据处理线程
DataTable dtprocessing = Model.DataAccess.dataTable("select ETLName from ETLSettings");
foreach (DataRow dr in dtprocessing.Rows)
{
Common.etlprocessing.CreateThead(dr[0].ToString().Trim());
}
}

2、线程创建方法

public bool CreateThead(string ETLTableName)
{
bool flag=false;
//TableName = ETLTableName;
try
{
Thread th = new Thread(new ParameterizedThreadStart(Do));
th.IsBackground = true;
th.Name = ETLTableName;
th.Start(ETLTableName);

threadlists.Add(ETLTableName, th);


flag = true;
}
catch (Exception ex)
{
flag = false;
}

return flag;
}


3、线程执行的方法。
public void Do(object TableName)
{
try
{
Processing(TableName.ToString());

//Thread.Sleep(60000);//线程一分钟跑一次

Thread.Sleep(1000);
}
catch (Exception)
{

}

}

问题一:
为什么线程只有在启动的时候跑了一遍“Do(object TableName)”方法,然后它的状态就变为“Stopped”了??? “Thread.Sleep(1000);”不是指定执行一次,空闲一秒吗,怎么“ThreadState”变为“Stopped”了。


问题二:
难道是因为“Processing(TableName.ToString())”方法中有错误??? 但“Processing”方法不在主线程中,它如果有错误VS2010不会提示吗??? 如果它里面有错误怎样捕获?

问题三:“Processing(TableName.ToString())”里面有很多的处理过程,如果最外面使用“Try catch”,会不会非常浪费资源呢???
...全文
340 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ViewStates 2013-01-05
  • 打赏
  • 举报
回复
引用 4 楼 sswp7 的回复:
线程的最外面必须要用“While”保证线程持续运行啊。
最外面指哪?申明新线程的时候还是线程对应的委托方法内? 另一个建议是这个东东最好不要自己起线程而是使用线程池来打理。
sswp7 2013-01-05
  • 打赏
  • 举报
回复
“尝试释放正在使用的 RCW。活动线程或其他线程上正在使用该 RCW。释放正在使用的 RCW 的尝试会导致损坏或数据丢失。” 这是怎么回事啊??? “客户端”调用“服务端 的 WCF服务”向“Access”库中插数据。 “服务端”使用“子线程”将插入的数据进行汇总处理,存入“数据仓库”。这是报出了这样的错误,为什么呢??? “RCW”是怎么回事???
失落的神庙 2013-01-05
  • 打赏
  • 举报
回复
这两级是怎么来的
sswp7 2013-01-05
  • 打赏
  • 举报
回复
线程的最外面必须要用“While”保证线程持续运行啊。
ViewStates 2013-01-05
  • 打赏
  • 举报
回复
1.你对应的委托方法和Thread.Sleep已经执行完了啊,你还要这个线程干嘛? 2.编译时只能保证代码书写是正确的,但没办法保证运行时的“正确性”,委托方法有异常需要你自己在对应的委托方法中捕捉 3.不明白你浪费资源是什么意思,什么资源被浪费了?在哪里去捕捉异常完全取决于你的需求,但你try的地方离异常抛出的位置越近则更容易发现问题。
cheng2005 2013-01-05
  • 打赏
  • 举报
回复
你的线程就做了 Processing(TableName.ToString()); Thread.Sleep(1000); 这两件事,做完当然就休息了。你以为线程是什么?你以为线程是一个二傻子,你告诉它做一件事,然后它就一遍又一遍的去做,你把发明线程的人想的太蠢了...
gxingmin 2013-01-05
  • 打赏
  • 举报
回复
1、你do里又没有while或for等循环,当然执行一次就shop了 2、Processing应该没有错 3、在try catch 外面套层while循环 public void Do(object TableName) { while(true) //或者判断主程序是否退出 { try { Processing(TableName.ToString()); } catch (Exception) { } //Thread.Sleep(60000);//线程一分钟跑一次 Thread.Sleep(1000); } }

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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