多线程处理 怎么知道线程已处理完毕

bustersword 2011-05-24 01:31:11

protected void s(){
thread = new System.Threading.Thread(
new System.Threading.ThreadStart(download));
thread.Start();
}
protected void download()
{
//进行多文件下载操作
SFTP.download(drive);
}
private System.Threading.Timer timerlisten;
protected void start()
{
s(); //这里我启用一个线程
timerlisten = new System.Threading.Timer(new TimerCallback(displayProgess), this, 5000, 100);
//我又启用一个timer的多线程,来监控单个文件下载的进度
}

//我想知道怎么才能监控到下载进程的结束,我试过在里面加上
thread.join();
//但是线程就会阻塞在那了,timer都走不了,必须得等那个下载进程走完,这不是我想要的效果
//我也试过用其他办法
AutoResetEvent events = new AutoResetEvent(false);
List<AutoResetEvent> Events = new List<AutoResetEvent>();
Events.Add(events);
WaitCallback wait = new WaitCallback(s);
ThreadPool.QueueUserWorkItem(wait);
if (WaitHandle.WaitAll(Events.ToArray()))
{
MessageBox.Show("2");
}
//还是不行,求解= =


...全文
188 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
绝代坏坏 2011-05-24
  • 打赏
  • 举报
回复
异步回调啊。
bustersword 2011-05-24
  • 打赏
  • 举报
回复
谢谢ghost5216
我混淆了概念哈,结贴
小道消息 2011-05-24
  • 打赏
  • 举报
回复
顶下,学习了
ghost5216 2011-05-24
  • 打赏
  • 举报
回复
ManualResetEvent manualEvent= new ManualResetEvent(fasle);
form:
//启动主线程
//启动监控线程
void button_click()
{
manualEvent.Set();
}

void MainWork()//主线程
{
while(true)
{
manualEvent.WaitOne();
manualEvent.ReSet();
//启动下载线程
}
}

void DownLoad()//下载线程
{
//dosomething
manualEvent.Set();
}

伪代码
bustersword 2011-05-24
  • 打赏
  • 举报
回复
- -那请告诉我,该怎么弄,不甚感激
ghost5216 2011-05-24
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 bustersword 的回复:]
主进程 开了 A,B两个线程,A来下载,B来监控
我现在想让主进程知道A完了,好让A再执行,同时
不影响B工作

差不多,我现在就像知道这样的
[/Quote]
说了半天 最后还是线程。
bustersword 2011-05-24
  • 打赏
  • 举报
回复
额,糊涂了,那告诉我线程间,可以实现我想要
的么,咋个弄法
ghost5216 2011-05-24
  • 打赏
  • 举报
回复
既然是“进程”,而非“线程”。
你还是用内存映射文件吧。
你代码中的自动事件跨越不了进程边界。
bustersword 2011-05-24
  • 打赏
  • 举报
回复
主进程 开了 A,B两个线程,A来下载,B来监控
我现在想让主进程知道A完了,好让A再执行,同时
不影响B工作

差不多,我现在就像知道这样的
bustersword 2011-05-24
  • 打赏
  • 举报
回复
AutoResetEvent events = new AutoResetEvent(false);

WaitCallback wait = new WaitCallback(startagain);
ThreadPool.QueueUserWorkItem(wait,events );
thread = new System.Threading.Thread(
new System.Threading.ThreadStart(delegate
{
while(true ){
if (events.WaitOne(-1, true))
{
events.Set();
MessageBox.Show("2");
break;
}
}
}));
thread.Start();

我也试过这样写,但是messagebox根本不鸟我

回楼上,我下载的进程和监控的进程都是另外开的
ghost5216 2011-05-24
  • 打赏
  • 举报
回复
AutoResetEvent events = new AutoResetEvent(false);

进度线程中
events.WaitOne();

下载线程中
SFTP.download(drive);
evetns.Set();
ps:如果SFTP.download(drive);另开线程,则另当别论。

不是很理解你的疑问

636f6c696e 2011-05-24
  • 打赏
  • 举报
回复
线程结束前给主线程发一个消息
dllimport下postmessage
bustersword 2011-05-24
  • 打赏
  • 举报
回复
回复楼上,下载进度那些不是我现在的问题
我现在只是线程操作的问题,谢谢你的回答
ghost5216 2011-05-24
  • 打赏
  • 举报
回复
就你的题目来看
可以用Thread ::ThreadState 属性

就你代码的注释来看
你至少要知道正在下载的文件的大小,
记录每次接收的大小
可以根据时间自己评估速度,
来计算下载进度的百分比。
bdmh 2011-05-24
  • 打赏
  • 举报
回复
方法很多,可以线程结束时发消息给进程,或者线程中不是有waitone吗,或者用api的waitforsingleobject

110,539

社区成员

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

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

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