异步,Windows窗体中的多线程
本文关键字:多线程 窗体 Windows 异步 | 更新日期: 2023-09-27 18:08:51
我正在从数据库中检索大约100k行的数据到datagridview。此过程最多需要5-6秒。然而,在这几秒钟内,用户不能移动鼠标或点击任何其他按钮。如何使用aysnc/多线程实现流畅的用户界面
查看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!"));