我有一个winform有几个组合框和一个gridview。保持响应的UI
最初我正在创建带有行和列的gridview,没有填充数据。
填充数据以网格是长期运行的任务,这将通过所有的行和循环中读取列标题,并根据这将适用不同的颜色和数据给每个小区。
我想要实现的是在表单加载事件中加载网格,并在表单加载后开始向网格填充数据,以便用户可以看到发生了什么。由于我将根据组合值加载数据,因此同样的情况适用于组合框值更改。
我曾尝试是这样的......
在窗体加载我打电话方法
private void LoadForm()
{
DataBind(); // this will load the initial grid without cell data
this.BeginInvoke((MethodInvoker)this.LongRunningProcess1);
this.BeginInvoke((MethodInvoker)this.LongRunningProcess2);
}
但仍须采取很长一段时间,我没有响应UI。
我也尝试过这样的事情,但没有运气....
ThreadStart ts = LongRunningProcess1;
Thread t1 = new Thread(ts);
t1.Start();
而且使用后台工作完成长时间运行的操作导致“跨线程操作”问题。
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
LongRunningProcess1();
LongRunningProcess2();
}
任何帮助,使这个工作是欣赏..
感谢
UPDATE
我发现了一个非常酷的解决方案Updating Your Form from Another Thread without Creating Delegates for Every Type of Update
感谢您的答案! !
我建议您使用BackgroundWorker,以便在UI线程之外执行长时间运行的操作。 http://www.switchonthecode.com/tutorials/csharp-tutorial-using-the-backgroundworker-class – Phil 2012-07-13 08:34:48
首先确定究竟需要很长时间,直到“这个循环在这里,特别是这个调用内部的水平循环”。 – Jon 2012-07-13 08:36:14
顺便说一句,调用'this.BeginInvoke'不会帮助你完成任何长时间运行的任务 - 它只是在UI事件循环中调度你的任务并返回。这意味着该任务将由GUI线程处理,仍冻结您的应用程序。 – undefined 2012-07-13 08:43:09