首页 新闻 会员 周边 捐助

Click事件里有个方法执行时间很长,而且方法会用到其他控件,有什么好的方法么?

0
悬赏园豆:30 [待解决问题]

界面有一个button, 一个textBox.

想得到的是:点击button 执行方法doWork(),textBox里则显示doWork()方法的一些提示信息。

但是因为doWork()执行时间很长,点击Button后会造成界面无法响应。

用异步操作的时候则提示 TextBox在被另一个线程占用。

 

有什么解决方法么?

laika1234的主页 laika1234 | 初学一级 | 园豆:69
提问于:2013-02-21 23:17
< >
分享
所有回答(7)
0
  1. 在单独的线程中执行dowork方法可以解决界面无响应问题
  2. 在dowork中要对ui控件操作的时候通过invoke的方式可以解决ui控件被了一个线程占用的问题。

如下是一个示例,你可以照着修改一下。

    private void button1_Click(object sender, EventArgs e)
    {
        ThreadPool.QueueUserWorkItem(_ => DoWork());
    }

    void DoWork()
    {
        for (int i = 0; i < 10; i++)
        {
            Thread.Sleep(1000);
            this.Invoke(new Action(() => textBox1.Text = DateTime.Now.ToString()));
        }
    }
天方 | 园豆:5432 (大侠五级) | 2013-02-21 23:34
0

MethodInvoker m0 = delegate()
{
 你要执行的代码
};
try
{
BeginInvoke(m0);
}
catch
{
}

项工 | 园豆:71 (初学一级) | 2013-02-22 17:24
0
private void button1_Click(object sender, EventArgs e)
    {
        new Thread(()=>_ => DoWork()).Start();
    }

    void DoWork()
    {
        for (int i = 0; i < 10; i++)
        {
            Thread.Sleep(1000);
            this.Invoke(new Action(() => textBox1.Text = DateTime.Now.ToString()));
        }
    }
RyanCheng | 园豆:474 (菜鸟二级) | 2013-02-25 10:04
0

主线程更新界面操作,辅助线程作后台操作

推荐一个类:BackgroundWorker,看下msdn的用法。。。

—木木鱼— | 园豆:215 (菜鸟二级) | 2013-02-26 15:50
0

1.使用异步方法执行你的doWork(),然后在回调方法里面在textbox上显示你要的信息。

2.手动另起一个线程来处理dowork(),然后再调用主UI线程在textbox上显示你要的信息。

希望能帮到你

Zachary_Fan | 园豆:762 (小虾三级) | 2013-02-26 16:02
0

Application.DoEvents();

kingboy8808 | 园豆:5 (初学一级) | 2013-08-02 14:39
0

你所碰到的错误,应该是你的textbox被ui线程所占用了。你要用事件的方式把你需要表达的字符,添加到UI的时间中

编译真难 | 园豆:33 (初学一级) | 2013-09-18 10:35
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册