c# 通过异步委托的执行结果更新UI界面
我在后台线程在执行任务,执行一条需要一定时间,成功执行后就往UI线程更新一条记录(用ListBox接收记录)这个操作我目前会做。但是我目前想做一个功能,就是后台线程在执行...
我在后台线程在执行任务,执行一条需要一定时间,成功执行后就往UI线程更新一条记录(用ListBox接收记录)这个操作我目前会做。但是我目前想做一个功能,就是后台线程在执行的过程中,UI界面上正在执行的那条显示“执行中,请稍后.....”。后台执行成功后,这条记录马上在UI线程更新为(“执行成功”或者“执行失败”)。求教下如何操作。 网上搜到通过异步委托可以监听后台线程的执行状态,但是我一直不会弄,我目前已知都是通过申请线程的方式解决的。我下面贴一个简单的demo,往懂的高手帮我改成我需要的结果。谢谢。
public partial class frmMain : Form
{
public delegate void UpdateLogDel(int index);
UpdateLogDel _updateLog;
int index = 0;
public frmMain()
{
InitializeComponent();
}
private void btnStart_Click(object sender, EventArgs e)
{
_updateLog = UpdateMessage;
Thread thread = new Thread(() =>
{
while (true)
{
index++;
Thread.Sleep(TimeSpan.FromSeconds(2));//模拟我的操作需要很长时间。
_updateLog(index);
}
});
thread.IsBackground = true;
thread.Start();
}
void UpdateMessage(int i)
{
if (this.InvokeRequired)
this.Invoke(_updateLog, i);
else
this.lstLog.Items.Add("测试记录" + i.ToString());
}
}
下面老兄貌似没明白我的意思,求大神按我的demo改成我想要的效果,目前我已经通过 AsyncOperationManager 这个类来实现我想要的效果了。但是我想用更多的方式实现下,我不太明白AsyncOperationManager 内部实现的原理。 展开
public partial class frmMain : Form
{
public delegate void UpdateLogDel(int index);
UpdateLogDel _updateLog;
int index = 0;
public frmMain()
{
InitializeComponent();
}
private void btnStart_Click(object sender, EventArgs e)
{
_updateLog = UpdateMessage;
Thread thread = new Thread(() =>
{
while (true)
{
index++;
Thread.Sleep(TimeSpan.FromSeconds(2));//模拟我的操作需要很长时间。
_updateLog(index);
}
});
thread.IsBackground = true;
thread.Start();
}
void UpdateMessage(int i)
{
if (this.InvokeRequired)
this.Invoke(_updateLog, i);
else
this.lstLog.Items.Add("测试记录" + i.ToString());
}
}
下面老兄貌似没明白我的意思,求大神按我的demo改成我想要的效果,目前我已经通过 AsyncOperationManager 这个类来实现我想要的效果了。但是我想用更多的方式实现下,我不太明白AsyncOperationManager 内部实现的原理。 展开
1个回答
展开全部
已经加注释了,你看一下吧:
lblStatus.Text = "执行中,请稍候……";
Func<int> longTask = new Func<int>(delegate()
{
// 模拟长时间任务
Thread.Sleep(2000);
// 返回任务结果:5
return 5;
});
// 发起一次异步调用,实际上就是在.net线程池中执行longTask
// 这时由于是其它线程在工作,UI线程未被阻塞,所以窗体不会假死
longTask.BeginInvoke(ar =>
{
// 使用EndInvoke获取到任务结果(5)
int result = longTask.EndInvoke(ar);
// 使用Control.Invoke方法将5显示到一个label上,如果没有Invoke,
// 直接写lblStatus.Text="5",将会抛出跨线程访问UI控件的异常
Invoke(new Action(() => lblStatus.Text = "执行结果是:" + result));
}, null);
追问
嗯,你这个不错。
能不能麻烦您改成我那种样式的啊,就是不是只执行一次,有很多记录执行,每一条都需要等待, 最好做成一个循环模拟下。拜托了。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询