0

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

有没有一种方法可以让 UI 仍然响应用户输入?

4

2 回答 2

2

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

如果在加载时需要更新视图,您应该一次添加所有内容,或者至少以块的形式添加。通常只加载然后一次性添加数据会更快。

于 2015-10-28T05:51:57.423 回答
0

尝试使用任务库而不是使用 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();
    }
}
于 2015-10-28T10:43:41.477 回答