Winform线程间操作无效从不是创建控件的线程访问它的几个解决方案async和await?

来源:互联网 发布:河池网络问政平台 编辑:程序博客网 时间:2024/06/08 11:47

目录

概述

取消跨线程检查

使用委托异步调用

sync和await

总结

概述

最近在qq群里有一朋友,问起在winform中怎么通过开启线程的方式去处理耗时的操作,比如,查看某个目录下所有的文件,或者符合要求的文件。下班回来,也研究了一下。发现多线程这块有点薄弱,也算是补一补吧。

在winform开发,经常会遇到需要在控件上加载大量数据(也就是常说的耗时操作),这会导致程序出现假死状态,这个时候我们就会想到线程。

在智能客户端应用程序中,这样的线程创建并管理用户界面 (UI),因而称为 UI 线程。

可以将 UI 线程用于所有的处理,其中包括 Web 服务调用、远程对象调用和数据库调用。然而,以这种方式使用 UI 线程通常并不是一个好主意。在大多数情况下,您不能预测调用Web 服务、远程对象或数据库会持续多久,而且在 UI 线程等待响应时,可能会导致 UI 冻结。

通过创建附加线程,应用程序可以在不使用 UI 线程的情况下执行额外的处理。当应用程序调用 Web 服务时,可以使用多线程来防止 UI 冻结或并行执行某些本地任务,以整体提高应用程序的效率。在大多数情况下,您应该坚持在单独的线程上执行任何与 UI 无关的任务。

取消跨线程检查

 案例:现在做一个这样的测试项目,我们选择一个目录通过递归的方式,遍历所有的文件,将文件信息,加载到窗体的DataGridView控件上。界面如图所示:

代码

事件参数和委托:


加载中...
view sourceprint?
01.1 using System;
02.2 using System.Collections.Generic;
03.3 using System.Linq;
04.4 using System.Text;
05.5 using System.Threading.Tasks;
06.6
07.7 namespace Wofy.ThreadDemo
08.8 {
09.9
10.10     /// <summary>
11.11     ///功能描述    :    事件参数
12.12     ///开发者      :    wolfy
13.13     ///建立时间    :    2014年07月19日
14.14     ///修订描述    :   
15.15     ///进度描述    :   
16.16     ///版本号      :    1.0
17.17     ///最后修改时间:    2014年07月19日
18.18     /// </summary>
19.19     public class FileMessageEventArgs:EventArgs
20.20     {
21.21         public FileMessage fileMessage{set;get;}
22.22     }
23.23 }
FileMessageEventArgs.cs 加载中...
view sourceprint?
01.1 using System;
02.2 using System.Collections.Generic;
03.3 using System.Linq;
04.4 using System.Text;
05.5 using System.Threading.Tasks;
06.6
07.7 namespace Wofy.ThreadDemo
08.8 {
09.9
10.10     /// <summary>
11.11     ///功能描述    :    文件信息委托
12.12     ///开发者      :    wolfy
13.13     ///建立时间    :    2014年07月19日
14.14     ///修订描述    :   
15.15     ///进度描述    :   
16.16     ///版本号      :    1.0
17.17     ///最后修改时间:    2014年07月19日
18.18     /// </summary>
19.19     public delegate void FileMessageEventHandler(object sender, FileMessageEventArgs e);
20.20
21.21 }
FileMessageEventHandler.cs

文件信息类:


加载中...
view sourceprint?
01.1 using System;
02.2 <code class="plain" style="margin: 0px; padding: 0px; border: 0px; outline: 0px%3
0 0
原创粉丝点击