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控件上。界面如图所示:
代码
事件参数和委托:
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
}
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
}
文件信息类:
01.
1
using System;
02.
2
<code class="plain" style="margin: 0px; padding: 0px; border: 0px; outline: 0px%3 0 0
- Winform线程间操作无效从不是创建控件的线程访问它的几个解决方案async和await?
- Winform线程间操作无效从不是创建控件的线程访问它的几个解决方案async和await?
- WinForm中线程问题:线程间操作无效: 从不是创建控件“...”的线程访问它
- WinForm中线程问题:线程间操作无效: 从不是创建控件“...”的线程访问它
- 线程间操作无效: 从不是创建控件的线程访问它 解决方案
- 线程间操作无效: 从不是创建控件的线程访问它 解决方案
- Exception:线程间操作无效: 从不是创建控件的线程访问它 解决方案
- Winform中多线程的控件访问引发的“线程间操作无效,从不是创建控件的线程访问它”
- WinForm解决多线程操作控件问题 线程间操作无效: 从不是创建控件的线程访问它"
- c#线程问题:线程间操作无效:从不是创建控件 的线程访问它
- 线程间操作无效: 从不是创建控件“Control Name'”的线程访问它问题的解决方案及原理分析
- 线程间操作无效: 从不是创建控件“Control Name'”的线程访问它问题的解决方案及原理分析
- 线程间操作无效: 从不是创建控件“Control Name'”的线程访问它问题的解决方案及原理分析
- 线程间操作无效: 从不是创建控件“Control Name'”的线程访问它问题的解决方案及原理分析
- 线程间操作无效: 从不是创建控件“Control Name'”的线程访问它问题的解决方案及原理分析
- “线程间操作无效:从不是创建控件“XX”的线程访问它”的解决方法
- 线程间操作无效: 从不是创建控件“”的线程访问它的解决方法
- 小结“线程间操作无效: 从不是创建控件的线程访问它” 错误的解决方法
- C++ ofstream和ifstream详细用法
- word 从正文开始插入页码1.2.3......
- SSL/TLS 运行原理
- ORA-01552非系统表空间不能使用系统回滚段处理
- Java(1):运行多态性
- Winform线程间操作无效从不是创建控件的线程访问它的几个解决方案async和await?
- Winform线程间操作无效从不是创建控件的线程访问它的几个解决方案async和await?
- Intellij idea用快捷键自动生成序列化id
- Javascript Array和String的互转换
- python 模块学习_os
- OpenGL:纹理基础总结
- Java正则表达式的语法与示例
- labview与下位机通信的格式问题处理
- skyline内存溢出崩溃解决办法