C#关于用线程与界面响应的问题

RT我的程序后台处理耗时任务时,程序界面太卡。怎么处理呢?最近才接触线程,希望大神解答一下?最好发个实例看看!... RT 我的程序后台处理耗时任务时,程序界面太卡。怎么处理呢?最近才接触线程,希望大神解答一下?最好发个实例看看! 展开
 我来答
cactis0906
推荐于2016-08-16 · TA获得超过138个赞
知道小有建树答主
回答量:154
采纳率:100%
帮助的人:89.2万
展开全部
首先你要明白,你程序启动的时候会建立一个主线程,这个线程叫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 });
}
}
xy404750389
2013-06-27 · TA获得超过505个赞
知道小有建树答主
回答量:303
采纳率:0%
帮助的人:145万
展开全部
用多线程,新建一个线程,把耗时的方法放入这个线程,不懂加我40 47-50+389
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
咸鱼一击
2013-06-27 · TA获得超过1094个赞
知道答主
回答量:123
采纳率:0%
帮助的人:45.8万
展开全部
你是另外一个线程就不会卡啊。
你在主线程中
Thread tr=new Thread(doWork);
tr.start();

private doWork(){
//做耗时任务
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式