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 内部实现的原理。
展开
 我来答
百度网友d242235
推荐于2017-11-27 · TA获得超过2385个赞
知道大有可为答主
回答量:1403
采纳率:84%
帮助的人:805万
展开全部

已经加注释了,你看一下吧:

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);
追问
嗯,你这个不错。
能不能麻烦您改成我那种样式的啊,就是不是只执行一次,有很多记录执行,每一条都需要等待, 最好做成一个循环模拟下。拜托了。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式