UI在后台工作人员的频繁更新期间无响应

时间:2015-10-28 05:46:15

标签: c# multithreading datagridview backgroundworker message-pump

我正在开发一个逐行读取文件的Windows窗体应用程序[在后台工作线程中]并使用BeginInvoke填充datagridview。 在完成此操作时,UI变得无响应(无法取消/退出或拖动窗口),但我能够看到datagridview正在更新。 我所知道的是,这是因为消息被泵入消息队列,其优先级高于用户输入消息。

UI是否仍然可以保持对用户输入的响应?

2 个答案:

答案 0 :(得分:2)

由于您使用的是BeginInvoke,因此您正在UI线程上执行操作。如果你逐行阅读并逐一追加每一行,那么在那里有一个后台工作人员并没有什么帮助。

如果在加载时需要更新视图,则应该一次添加all,或者至少在块中添加。通常只需加载然后一次添加数据就会更快。

答案 1 :(得分:0)

尝试使用任务库而不是使用BackgroundWorker(任务比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();
    }
}