UI在后台工作程序频繁更新期间没有响应

本文关键字:响应 更新 后台 工作程序 UI | 更新日期: 2023-09-27 18:19:37

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

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

UI在后台工作程序频繁更新期间没有响应

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

如果在加载时需要更新视图,您应该一次添加所有视图,或者至少在块中添加。通常情况下,只加载然后一次性添加数据会更快。

尝试使用任务库而不是使用BackgroundWorker(任务在任何时候都比BackgroundWorkers好),下面的片段可以帮助

    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();
    }
}