多线程 画面假死 判断线程是否已经结束

higoodstudydaydayup 2010-09-21 10:17:14
*
* 关于多线程与画面假死与判断线程是否已经结束
* 1.假设在数据查询或者更新时(bnt_Click)。花费比较长的时间。会假死。所以我另开线程(Search_Thread)
* 2.那如何在父线程(bnt_Click)如何知道。子线程(Search_Thread)已经结束了呢。如 我想在查询完或者更新完(Search_Thread结束)后。报个Msg
* 2.1
* 当然在只有一个线程时。我只可以在该子线程结束后加入事件来报我的Msg
* 2.2
* 但假设我有很多线程(>10)时。我不可能在每个线程里。加事件。吧
* 2.3
* 所以我想能不能。 做到让父线程 捕获 所有子线程已经结束了。然后。再执行下面报Msg
* 2.4
* 用Thread.join的话可等待。但这样父线程(bnt_Click)就会假死
* 3. 所以想请问下。我哪里理解错了。或者有什么好方法。谢谢了
*
...全文
417 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
让爱延续 2010-09-22
  • 打赏
  • 举报
回复
回调也可以吧
liyf_liyunfeng 2010-09-22
  • 打赏
  • 举报
回复
来学习哈
ElfSundae 2010-09-22
  • 打赏
  • 举报
回复
异步多线程 委托

backgroundworker
哥子谭 2010-09-21
  • 打赏
  • 举报
回复
建议使用多线程来解决
  • 打赏
  • 举报
回复
en.谢谢楼上的几位。
我先去试试。。
bloodish 2010-09-21
  • 打赏
  • 举报
回复
给你一个例子,自己去扩展.

static void Main(string[] args)
{
//定义同步事件
AutoResetEvent[] events =
{
new AutoResetEvent(false),
new AutoResetEvent(false),
new AutoResetEvent(false),
new AutoResetEvent(false)
};

Action notify = delegate
{
//通知,等待全部完成才输出信息
if (WaitHandle.WaitAll(events, 0))
{
Console.WriteLine("All threads finished");
}
};

//线程,把你的处理代码放在这里
WaitCallback wcb = (status) =>
{
//to do, you time cost codes
Random r = new Random((int)DateTime.Now.Ticks);
Thread.Sleep(r.Next(100,1000));
Console.WriteLine("Thread finished");
//Event置位,表明处理完成
AutoResetEvent are = status as AutoResetEvent;
are.Set();
//通知
notify();
};

//放入线程池,每个Thread关联一个AutoResetEvent
foreach (AutoResetEvent are in events)
{
ThreadPool.QueueUserWorkItem(wcb, are);
}
}
CGabriel 2010-09-21
  • 打赏
  • 举报
回复
1. 在你的线程方法中,return 前去加个标志
2. 不想再每个方法后面加,就创建一个基类

通过判断线程状态来获得线程方法的状态是个极度不靠谱的方法。
Code従業員 2010-09-21
  • 打赏
  • 举报
回复
申明为后台线程就不会假死了。
xianzhong2008 2010-09-21
  • 打赏
  • 举报
回复
使用backgroundworker这个控件可以监控到你想要的结果,
做到捕获所有子线程已经结束了。然后。再执行下面报Msg 当然这里你并不要另外再开线程,用while对条件进行限制就可以达到你要的效果
随手写了个你看一下
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace MyNewsReader.UI
{
public partial class Form1 : Form
{
BackgroundWorker worker = new BackgroundWorker();
public Form1()
{
InitializeComponent();
worker.DoWork += new DoWorkEventHandler(worker_DoWork);//后台线程开始
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);//后台线程结束
}

void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
MessageBox.Show("线程结束");
}

void worker_DoWork(object sender, DoWorkEventArgs e)
{
//执行你要执行的内容
DowWorkTest();
}

private void DowWorkTest()
{
//这里你可以写你想要做的效果
int i = 0;
while (i < 100)
{
i++;
}
}
}
}
ztenv 2010-09-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 bloodish 的回复:]
给你一个例子,自己去扩展.

C# code

static void Main(string[] args)
{
//定义同步事件
AutoResetEvent[] events =
{
new AutoResetEvent(false),
……
[/Quote]

这个很好,能解决你的问题,其实多个线程每个线程加事件也不是坏事儿;
fangxiaofelix 2010-09-21
  • 打赏
  • 举报
回复
恩,用多线程,如果不适用进度条的话,也可以将鼠标编程沙漏,提高用户体验效果

110,499

社区成员

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

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

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