【发布时间】:2012-09-27 15:06:29
【问题描述】:
我有一些在我的 WinForms 应用程序中运行的繁重任务。问题是,当它运行时,它会冻结 UI(UI 主线程)。
我还没有在 C# 中使用过多的线程和委托,这就是为什么我希望有人可以帮助我,如何在不冻结 UI 的情况下处理这些繁重的任务,所以用户不认为应用程序在等待时崩溃?
例如。我通过我的FrontController 打了一个电话,这需要时间:
_controller.testExportExcel(wrapper, saveDialog.FileName);
因为它正在创建一个 Excel 文件。我不会让应用在运行时在 UI 上做出响应。
流程繁重任务的另一个示例可能是这样的:
private void dataGridView_liste_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
if (e.ListChangedType != ListChangedType.ItemDeleted)
{
foreach (DataGridViewRow r in dataGridView_liste.Rows)
{
DataGridViewCellStyle red = dataGridView_liste.DefaultCellStyle.Clone();
red.BackColor = Color.LightGreen;
if (r.Cells["News"].Value != null && (bool)r.Cells["News"].Value == true)
r.DefaultCellStyle = red;
}
}
}
foreach 循环需要时间,并冻结 UI。我认为运行进程并在完成后自动关闭的异步线程可能很有用。但是它是如何工作的呢??
【问题讨论】:
-
对于 excel 创建查找
BackgroundWorker。对于第二个循环,所有代码都是 UI 代码,因此无法线程化,但看起来不像是长时间运行的代码。你有多少行?您也可以暂停网格绘制,它可能会有所帮助。 -
你确定这不是重复的吗? SO充满了类似的问题......
-
@AmiramKorach 下周将尝试使用 BackgroundWorker 进行方法调用,看看它是否可以帮助我。第二个循环大约有 512+ 行,出于视觉原因,整个想法是在每行中创建绿色背景。根本不可能创建在 UI 中运行的异步,因此 UI 在加载某些内容时不会冻结?和/或制作一个显示 UI 正在加载的加载微调器???
-
只有在大部分过程没有更新 UI 时,您才能异步执行操作。如果大部分过程是 UI 更新,您将不会有任何收获,因为 UI 更新必须在 UI 线程中完成。对于批量 UI 更新,您可以暂停网格绘制,以便更新更快。
标签: c# winforms multithreading