C#关于用线程与界面响应的问题
RT我的程序后台处理耗时任务时,程序界面太卡。怎么处理呢?最近才接触线程,希望大神解答一下?最好发个实例看看!...
RT 我的程序后台处理耗时任务时,程序界面太卡。怎么处理呢?最近才接触线程,希望大神解答一下?最好发个实例看看!
展开
3个回答
展开全部
首先你要明白,你程序启动的时候会建立一个主线程,这个线程叫UI线程,从字面理解就可以知道这个线程专门处理有关UI(也就是界面)所有的事件。界面卡是因为,你进入了比如点击事件里面,线程一直在处理这个任务,这个任务一直没返回,也就是这个方法一直没返回。所以这个时候你点击界面是没反应的,也就是假死状态。
如果需要处理一个长时间的任务,应该建立一个新线程B去处理。同时B要去修改界面的话,需要用委托。因为界面是主线程负责,用委托是把修改界面这个动作交给主线程去做,如果由B去做的话可能会造成死锁之类问题
C#从另外一个线程操作windows窗体上的控件,必须要使用委托,通过委托调用UI线程去操控控件
//这个是窗体线程MainFrm
public delegate void Delegate_ChangeCallBack(string _value);
public Delegate_ChangeCallBack dlg_Change;
public static MainFrm mainFrm;
private void MainFrm_Load(object sender, EventArgs e)
{
mainFrm = this;
dlg_Change = new Delegate_ChangeCallBack (ChangeUI);
}
private void ChangeUI(string _value)
{
this.txt_Change.text = _value;
//do something...
}
private void button1_Click(object sender, EventArgs e)//下面是你的新线程
{
Client c = new Client();
Thread newThread = new Thread(new ParameterizedThreadStart(c.NewThread());
newThread.Name = "Door2 Conn Thread:" + mission.Id;
newThread.IsBackground = true;
newThread.Start();
}
Class Client
{
private void NewThread()
{
string _Id = "change";
MainFrm.mainFrm.BeginInvoke(MainFrm.mainFrm.dlg_Change , new object[] { _Id });
}
}
如果需要处理一个长时间的任务,应该建立一个新线程B去处理。同时B要去修改界面的话,需要用委托。因为界面是主线程负责,用委托是把修改界面这个动作交给主线程去做,如果由B去做的话可能会造成死锁之类问题
C#从另外一个线程操作windows窗体上的控件,必须要使用委托,通过委托调用UI线程去操控控件
//这个是窗体线程MainFrm
public delegate void Delegate_ChangeCallBack(string _value);
public Delegate_ChangeCallBack dlg_Change;
public static MainFrm mainFrm;
private void MainFrm_Load(object sender, EventArgs e)
{
mainFrm = this;
dlg_Change = new Delegate_ChangeCallBack (ChangeUI);
}
private void ChangeUI(string _value)
{
this.txt_Change.text = _value;
//do something...
}
private void button1_Click(object sender, EventArgs e)//下面是你的新线程
{
Client c = new Client();
Thread newThread = new Thread(new ParameterizedThreadStart(c.NewThread());
newThread.Name = "Door2 Conn Thread:" + mission.Id;
newThread.IsBackground = true;
newThread.Start();
}
Class Client
{
private void NewThread()
{
string _Id = "change";
MainFrm.mainFrm.BeginInvoke(MainFrm.mainFrm.dlg_Change , new object[] { _Id });
}
}
展开全部
用多线程,新建一个线程,把耗时的方法放入这个线程,不懂加我40 47-50+389
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你是另外一个线程就不会卡啊。
你在主线程中
Thread tr=new Thread(doWork);
tr.start();
private doWork(){
//做耗时任务
}
你在主线程中
Thread tr=new Thread(doWork);
tr.start();
private doWork(){
//做耗时任务
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询