C# winfrom异步加载数据不影响窗体UI的操作方法

 更新时间:2024年12月11日 11:22:48   作者:xcLeigh  
这篇文章主要介绍了C# winfrom 异步加载数据不影响窗体UI,在 WinForms 应用程序中,如果数据加载是一个比较耗时的操作,直接在主线程中进行加载会导致 UI 冻结,这是因为 WinForms 的 UI 是单线程的,主线程被阻塞时就无法处理其他 UI 相关的任务

前言

在数字浪潮汹涌澎湃的时代,程序开发宛如一座神秘而宏伟的魔法城堡,矗立在科技的浩瀚星空中。代码的字符,似那闪烁的星辰,按照特定的轨迹与节奏,组合、交织、碰撞,即将开启一场奇妙且充满无限可能的创造之旅。当空白的文档界面如同深邃的宇宙等待探索,程序员们则化身无畏的星辰开拓者,指尖在键盘上轻舞,准备用智慧与逻辑编织出足以改变世界运行规则的程序画卷,在 0 和 1 的二进制世界里,镌刻下属于人类创新与突破的不朽印记。

一、背景介绍

在 WinForms 应用程序中,如果数据加载是一个比较耗时的操作(比如从数据库读取大量数据、加载大型文件等),直接在主线程中进行加载会导致 UI 冻结。这是因为 WinForms 的 UI 是单线程的,主线程被阻塞时就无法处理其他 UI 相关的任务,如用户输入、界面更新等。而异步加载数据可以解决这个问题,让数据加载在后台线程进行,UI 线程可以继续响应用户操作。

二、使用BackgroundWorker组件实现异步加载数据

2.1 添加BackgroundWorker组件

添加BackgroundWorker组件:在 WinForms 设计器中,从工具箱的 “组件” 选项卡中找到 “BackgroundWorker” 并将其拖放到窗体上。

2.2 处理DoWork事件

处理DoWork事件:这个事件在后台线程中执行,用于加载数据。例如,如果要从数据库加载数据,可以在这个事件处理程序中编写数据库访问代码。

   private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
   {
       // 这里模拟一个耗时的数据加载操作,比如从数据库读取数据
       System.Threading.Thread.Sleep(5000);
       // 假设这里是真正从数据库获取数据的代码
       List<string> data = new List<string>();
       data.Add("Data 1");
       data.Add("Data 2");
       // 将加载的数据作为结果返回
       e.Result = data;
   }

处理RunWorkerCompleted事件:当后台操作完成后,这个事件会在主线程中被触发。在这里可以更新 UI 来显示加载的数据。

   private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
   {
       if (e.Error == null)
       {
           List<string> data = (List<string>)e.Result;
           // 假设dataGridView1是一个DataGridView控件,用于显示数据
           dataGridView1.DataSource = data;
       }
       else
       {
           // 处理错误情况,比如显示错误消息
           MessageBox.Show("数据加载出错:" + e.Error.Message);
       }
   }

启动异步操作:可以在某个按钮的点击事件或者窗体的加载事件等地方启动BackgroundWorker。

   private void button1_Click(object sender, EventArgs e)
   {
       if (!backgroundWorker1.IsBusy)
       {
           backgroundWorker1.RunWorkerAsync();
       }
   }

使用async/await实现异步加载数据(如果数据加载操作本身支持异步方法)
假设你有一个异步方法来加载数据,例如从网络获取数据的异步方法。

   private async void button2_Click(object sender, EventArgs e)
   {
       // 假设LoadDataAsync是一个异步方法,用于加载数据
       List<string> data = await LoadDataAsync();
       dataGridView1.DataSource = data;
   }

这个LoadDataAsync方法可能内部使用HttpClient从网络获取数据等,并且使用async和await关键字来实现异步操作。例如:

   private async Task<List<string>> LoadDataAsync()
   {
       using (HttpClient client = new HttpClient())
       {
           HttpResponseMessage response = await client.GetAsync("https://example.com/api/data");
           if (response.IsSuccessStatusCode)
           {
               string json = await response.Content.ReadAsStringAsync();
               // 假设这里是将JSON数据反序列化为List<string>的代码
               return JsonConvert.Deserialize<List<string>>(json);
           }
           else
           {
               throw new Exception("数据加载失败");
           }
       }
   }

三、延伸内容

3.1 错误处理和进度报告

错误处理和进度报告:在BackgroundWorker中,可以通过RunWorkerCompletedEventArgs.Error属性来处理错误,还可以使用BackgroundWorker.ProgressChanged事件来报告进度。对于async/await,可以使用try - catch块来处理异常,并且如果加载过程有进度信息,可以通过事件或者返回的进度对象来更新 UI 显示进度。

3.2 线程安全

线程安全:在更新 UI 时,要确保操作是线程安全的。对于BackgroundWorker,因为RunWorkerCompleted事件是在主线程中触发的,所以可以直接更新 UI。但如果是在其他异步场景下,可能需要使用Invoke或BeginInvoke方法来确保在主线程中更新 UI,以避免跨线程访问异常。

结束语

以上就是C# winfrom异步加载数据不影响窗体UI的操作方法的详细内容,更多关于C# winfrom异步加载数据的资料请关注脚本之家其它相关文章!

相关文章

  • C#模式画刷HatchBrush用法实例

    C#模式画刷HatchBrush用法实例

    这篇文章主要介绍了C#模式画刷HatchBrush用法,实例分析了模式画刷HatchBrush绘图的相关技巧,需要的朋友可以参考下
    2015-06-06
  • C#实现发送简单HTTP请求的方法

    C#实现发送简单HTTP请求的方法

    这篇文章主要介绍了C#实现发送简单HTTP请求的方法,涉及C#操作http的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-04-04
  • C# 通过Socket读取大量数据的示例

    C# 通过Socket读取大量数据的示例

    这篇文章主要介绍了C# 通过Socket读取大量数据的示例,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下
    2021-03-03
  • C#根据身份证号码判断出生日期和性别

    C#根据身份证号码判断出生日期和性别

    这篇文章主要为大家详细介绍了C#根据身份证号码判断出生日期和性别的方法,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • C#实现对图片文件的压缩、裁剪操作实例

    C#实现对图片文件的压缩、裁剪操作实例

    这篇文章主要介绍了C#实现对图片文件的压缩、裁剪操作,较为详细的介绍了操作过程中用到的相关类文件及具体的操作步骤,是非常实用的技巧,需要的朋友可以参考下
    2014-09-09
  • C#流程控制详解

    C#流程控制详解

    这篇文章主要介绍了C#流程控制详解,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-07-07
  • C# PadLeft、PadRight用法详解

    C# PadLeft、PadRight用法详解

    本文主要介绍了C# PadLeft、PadRight用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • C#使用DllImport调用非托管的代码的方法

    C#使用DllImport调用非托管的代码的方法

    C#调用非托管代码的方式主要有Com调用、DllImport方式调用、加载非托管动态链接库、直接执行机器码等方式。现在介绍一下我自己常用的DllImport方式调用MSDN中提到的GetShortPathName方法;
    2013-03-03
  • C#实现简单的loading提示控件实例代码

    C#实现简单的loading提示控件实例代码

    本文通过实例代码给大家介绍了C#实现简单的loading提示控件功能,代码非常简单,具有参考借鉴价值,需要的朋友参考下吧
    2017-09-09
  • WPF应用程序本地化的最佳方法分享

    WPF应用程序本地化的最佳方法分享

    应用程序本地化有很多种方式,选择合适的才是最好的,这篇文章主要为大家介绍了动态资源的方式,可以在不重启应用程序的情况下进行资源的切换,需要的可以参考下
    2023-08-08

最新评论