异步,Windows窗体中的多线程

本文关键字:多线程 窗体 Windows 异步 | 更新日期: 2023-09-27 18:08:51

我正在从数据库中检索大约100k行的数据到datagridview。此过程最多需要5-6秒。然而,在这几秒钟内,用户不能移动鼠标或点击任何其他按钮。如何使用aysnc/多线程实现流畅的用户界面

异步,Windows窗体中的多线程

查看Task库和async, c#中有一整节都是这样做的。

基本上你结束的东西像…

var records = await GetRecordsFromDatabase();
MyDataGridView.ItemSource = records;
private Task<IEnumerable<Record>> GetRecordsFromDatabase(){
    return Task.Run(() => {
          //do stuff the return IEnumerable<Records>
    });
}

请注意,虽然你可以使用线程,但在c#中,任务是一个更好的异步支持选择。

编辑-大多数数据库应该支持一些异步操作。在这种情况下,您可能有一个异步方法将数据从数据库转换为您需要的格式。您还可能希望遵循将自己的方法标记为async的惯例。比如. . . .
private async Task<IEnumerable<Record>> GetRecordsFromDatabaseAsync(){
    var dbRecords = await Database.GetRecordsAsync();
    //transform the database records and return them
}

让我们假设您正在执行所有这些处理器密集型工作,因为单击了一个按钮。希望你已经有工作在一个单独的方法,并从点击事件调用该方法。如果你把所有的工作都放在click事件中,把它移到它自己的方法中,并从click事件处理程序中调用它。

现在它仍然在一个线程上。我将在这里使用一个单独的线程,不过您也应该自己研究任务。要使用一个单独的线程来完成繁重的工作,编写2行代码,如下所示:

Thread t = new Thread(nameOfTimeConsumingMethod);
t.Start();

这样就行了。如果需要将输出写入textBox1,则不能直接从新线程中这样做(没有跨线程调用)。但是你仍然可以很容易地像这样间接地给这个方框写信。

BeginInvoke(new Action(()=>textBox1.text = "Hello world!"));