多线程 画面假死 判断线程是否已经结束
** 关于多线程与画面假死与判断线程是否已经结束
* 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. 所以想请问下。我哪里理解错了。或者有什么好方法。谢谢了
* --------------------编程问答-------------------- 申明为后台线程就不会假死了。 --------------------编程问答-------------------- 1. 在你的线程方法中,return 前去加个标志
2. 不想再每个方法后面加,就创建一个基类
通过判断线程状态来获得线程方法的状态是个极度不靠谱的方法。 --------------------编程问答-------------------- 给你一个例子,自己去扩展.
--------------------编程问答-------------------- en.谢谢楼上的几位。
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);
}
}
我先去试试。。 --------------------编程问答-------------------- 建议使用多线程来解决 --------------------编程问答-------------------- 恩,用多线程,如果不适用进度条的话,也可以将鼠标编程沙漏,提高用户体验效果 --------------------编程问答--------------------
这个很好,能解决你的问题,其实多个线程每个线程加事件也不是坏事儿; --------------------编程问答-------------------- 使用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++;
}
}
}
}
--------------------编程问答-------------------- 异步多线程 委托
backgroundworker --------------------编程问答-------------------- 来学习哈 --------------------编程问答-------------------- 回调也可以吧 --------------------编程问答--------------------
补充:.NET技术 , C#