线程问题,求指教

CANL464970302 2011-06-01 07:07:03

DataRowView rowViews = myDSs.Tables[0].DefaultView[0];
Photocount = Convert.ToInt32(rowViews["totals"]);//34
comNum = Convert.ToInt32(Math.Ceiling(Photocount * 1.0 / 5));// 9
Thread t = null;
for (int i = 0; i < 5; i++)
{
t = new Thread(new ParameterizedThreadStart(checkPhotos));
t.Start(i);
Thread.Sleep(1000);
}


为什么总是有漏掉的数据没有被修改? 是不是因为线程没有走完?
怎么控制线程能够使它全部运行完以后 弹出
ClientScript.RegisterStartupScript(this.GetType(), "a", "alert('图片识别完成');", true);
求大虾帮忙改改。
...全文
129 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
如果不是涉及输出到html的问题,而是后台线程被终止,你可以考虑使用系统线程池来执行你的1~5任务,而且也无需什么sleep。

不过总之用asp.net来写这类程序比较奇怪。可能你只会写asp.net程序。但是实际项目中,asp.net就应该做网页,长期的任务应该由windows服务所承载的业务服务器程序来做。
  • 打赏
  • 举报
回复
我为什么要说“asp.net问题最好到asp.net论坛去问”呢?其实编程不是只看一点语法,要了解程序所处的环境底层的基本机制。如果不从系统环境调度机制出发来了解你的程序,虽然简单地编写出来程序很容易,但是要让你测试程序和修改bug则只能干瞪眼了。
  • 打赏
  • 举报
回复
asp.net问题最好到asp.net论坛去问。

当for循环结束了(不管线程所执行的程序有没有结束),之后就进入页面的Render阶段,就输出html给客户端了,然后页面处理流程就结束了(页面即将释放了)。在Render执行之后,修改任何值都不可能输出给客户端。
种草德鲁伊 2011-06-02
  • 打赏
  • 举报
回复
那要看你委托里那个方法是怎么样的。

你得用上WaitHandle.WaitAll,等待所有线程运行完毕,再返回消息。
ttm1984 2011-06-02
  • 打赏
  • 举报
回复

for (int i = 0; i < 5; i++)
{
Thread t = null; // 放在这里?

t = new Thread(new ParameterizedThreadStart(checkPhotos));
t.Start(i);
Thread.Sleep(1000);
}

加油馒头 2011-06-02
  • 打赏
  • 举报
回复
等待所有线程结束在 退出提示
Joop_Song 2011-06-02
  • 打赏
  • 举报
回复
学习了。。
CANL464970302 2011-06-02
  • 打赏
  • 举报
回复
但是还是有漏掉的数据啊,感觉最后一个线程还是没走完就结束掉了。
WaitHandle.WaitAll(mre); 这句不是等待所有线程都走完才结束么?

CANL464970302 2011-06-02
  • 打赏
  • 举报
回复

ThreadPool.SetMaxThreads(100, 10);
for (int i = 0; i < 5; i++)
{
ThreadPool.QueueUserWorkItem(checkPhotos, i);
}
ManualResetEvent[] mre = new ManualResetEvent[5];
for (int i = 0; i < 5; i++)
mre[i] = new ManualResetEvent(false);
WaitHandle.WaitAll(mre);


这样么?
CANL464970302 2011-06-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 sp1234 的回复:]
如果不是涉及输出到html的问题,而是后台线程被终止,你可以考虑使用系统线程池来执行你的1~5任务,而且也无需什么sleep。

不过总之用asp.net来写这类程序比较奇怪。可能你只会写asp.net程序。但是实际项目中,asp.net就应该做网页,长期的任务应该由windows服务所承载的业务服务器程序来做。
[/Quote]

嗯,前台只是弹出识别完毕的窗口。没有输出到前台。
那么线程池的话要怎么做?
对线程不是很熟。
CANL464970302 2011-06-02
  • 打赏
  • 举报
回复
没人么?
会不会是因为 两个线程同时占用了一个 文件资源。
CANL464970302 2011-06-02
  • 打赏
  • 举报
回复

ThreadPool.SetMaxThreads(100, 100);
for (int i = 0; i < 10; i++)
{

ThreadPool.QueueUserWorkItem(checkPhotos, i);
}
ManualResetEvent[] mre = new ManualResetEvent[10];
for (int i = 0; i < 10; i++)
mre[i] = new ManualResetEvent(false);
WaitHandle.WaitAll(mre);
ClientScript.RegisterStartupScript(this.GetType(), "a", "alert('图片识别完成');", true);


事务(进程 ID 64)与另一个进程被死锁在 锁 | 通信缓冲区 资源上,并且已被选作死锁牺牲品。请重新运行该事务。

的错误是什么情况?
ycproc 2011-06-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 sp1234 的回复:]

如果不是涉及输出到html的问题,而是后台线程被终止,你可以考虑使用系统线程池来执行你的1~5任务,而且也无需什么sleep。

不过总之用asp.net来写这类程序比较奇怪。可能你只会写asp.net程序。但是实际项目中,asp.net就应该做网页,长期的任务应该由windows服务所承载的业务服务器程序来做。
[/Quote]
线程池 或者 异步线程调用我想都行吧

110,537

社区成员

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

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

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