UI 在后台工作人员频繁更新期间没有响应
UI not responsive during frequent updates from background worker
我正在开发一个 windows 表单应用程序,它 [在后台工作线程中] 逐行读取文件并[使用 BeginInvoke] 填充数据网格视图。
完成此操作后,UI 变得无响应(无法 Cancel/Exit 或拖动 window),但我能够看到 datagridview 正在更新。
我所知道的是,这是由于消息被泵入消息队列,消息队列的优先级高于用户输入消息。
有没有办法让 UI 仍然可以响应用户输入?
由于您正在使用 BeginInvoke
,因此您在 UI 线程上执行操作。如果您逐行阅读并一次追加每一行,那么在那里有一个后台工作人员并没有真正的帮助。
如果需要在加载时更新视图,您应该一次性添加所有内容,或者至少分块添加。通常只加载然后一次性添加数据会更快。
尝试使用 Task Library 而不是使用 BackgroundWorker(Task 总是比 BackgroundWorker 好),下面的代码片段可以提供帮助
CancellationTokenSource tokenSource2 = new CancellationTokenSource();
CancellationToken ct;
public MainWindowViewModel()
{
ct = tokenSource2.Token;
Task.Factory.StartNew(PopulateDataGrid, ct);
}
/// <summary>
///
/// </summary>
private void PopulateDataGrid()
{
for (int i = 1; i < 10000; i++)
{
if (!ct.IsCancellationRequested)
{
///Populate Your Control here
}
else
{
break;
}
}
}
public void OnCancelCLick()
{
tokenSource2.Cancel();
}
}
我正在开发一个 windows 表单应用程序,它 [在后台工作线程中] 逐行读取文件并[使用 BeginInvoke] 填充数据网格视图。 完成此操作后,UI 变得无响应(无法 Cancel/Exit 或拖动 window),但我能够看到 datagridview 正在更新。 我所知道的是,这是由于消息被泵入消息队列,消息队列的优先级高于用户输入消息。
有没有办法让 UI 仍然可以响应用户输入?
由于您正在使用 BeginInvoke
,因此您在 UI 线程上执行操作。如果您逐行阅读并一次追加每一行,那么在那里有一个后台工作人员并没有真正的帮助。
如果需要在加载时更新视图,您应该一次性添加所有内容,或者至少分块添加。通常只加载然后一次性添加数据会更快。
尝试使用 Task Library 而不是使用 BackgroundWorker(Task 总是比 BackgroundWorker 好),下面的代码片段可以提供帮助
CancellationTokenSource tokenSource2 = new CancellationTokenSource();
CancellationToken ct;
public MainWindowViewModel()
{
ct = tokenSource2.Token;
Task.Factory.StartNew(PopulateDataGrid, ct);
}
/// <summary>
///
/// </summary>
private void PopulateDataGrid()
{
for (int i = 1; i < 10000; i++)
{
if (!ct.IsCancellationRequested)
{
///Populate Your Control here
}
else
{
break;
}
}
}
public void OnCancelCLick()
{
tokenSource2.Cancel();
}
}