Winform开发中耗时操作封装用异步执行(.net 4.0)
来源:互联网 发布:公司网络环境搭建 vpn 编辑:程序博客网 时间:2024/06/11 12:57
先定义一个 BackgroundTask.cs 代码如下:
public class BackgroundTask { private static WaitDialogForm LoadingDlgForm = null; public static void BackgroundWork(Action<object> action, object obj) { using (BackgroundWorker bw = new BackgroundWorker()) { bw.RunWorkerCompleted += (s, e) => { LoadingDlgForm.Close(); LoadingDlgForm.Dispose(); }; bw.DoWork += (s, e) => { try { Action<object> a = action; a.Invoke(obj); } catch { } }; bw.RunWorkerAsync(); LoadingDlgForm = new WaitDialogForm("正在加载中......", "信息提示"); } } }
然后再需要加载耗时操作的地方,调用该类
大概如下:
private void loadData() { BackgroundTask.BackgroundWork(getData, null); } private void getData(object obj) { //这里执行耗时操作 的代码 譬如,加载远程数据之类,还有绑定数据到UI,比如this.gridview.datasource = 之类的操作 }
这样就非常方便调用了, 不知道有没有什么不当之处。望大家指导。
C#异步编程的实现方式(3)——ThreadPool线程池
在需要创建的线程很多,且都是比较小的线程的情况下,可以使用线程池(ThreadPool类)。ThreadPool是一个静态方法,提供了对一个线程集合的操作,它会在线程数不足时增加线程,空闲线程数过多时释放资源。
1、ThreadPool简单应用
调用ThreadPool.QueueUserWorkItem()方法,传递一个WaitCallBack委托类型的方法,并把这个方分配给线程池中的线程。线程池是自动运行的,如果线程池还没有运行,就会创建一个线程池,并启动第一个线程。如果线程池己经在运行,且有一个空闲线程来完成该任务,就把该作业传递给这个线程。
下面这个方法是一个符合WaitCallBack委托的方法:
static void WaitCallBackMethod(object param){ for (int i = 0; i < 5; i++) { Console.WriteLine(String.Format("Thread {0} is running", param)); Thread.Sleep(1000); }}
然后在主线程里给线程池添加方法:
static void Main(string[] args){ for (int i = 1; i <= 3; i++) { ThreadPool.QueueUserWorkItem(WaitCallBackMethod, i); } Console.Read();}
QueueUserWorkItem()方法的第二个参数是个object类型的参数,可传入一个数据到线程中。在主线程中,传入了3个方法到线程池中。运行结果如下:
可以看见三个线程分别在行动。顺序不一样是因为操作系统调度的原因。
2、最大与最小线程数
ThreadPool类会在需要时增减池中线程的线程数,直到最大的线程数。池中的最大线程数是可配置的。在双核CPU中,默认设置为1023个工作线程和1000个I/O线程。也可以指定在创建线程池时应立即启动的最小线程数,以及线程池,中可用的最大线程数。如果有更多的作业要处理,线程池中线程的个数也到了极限,最新的作业就要排队,且必须等待线程完成其任务。
可用下面的方法查看:
static void MaxThreads(){ int workerThreads; int ioThreads; ThreadPool.GetMaxThreads(out workerThreads, out ioThreads); Console.WriteLine(String.Format("Max worker threads: {0}; Max I/O threads: {1}", workerThreads, ioThreads)); ThreadPool.GetMinThreads(out workerThreads, out ioThreads); Console.WriteLine(String.Format("Min worker threads: {0}; Min I/O threads: {1}", workerThreads, ioThreads));}
结果为:
3、线程池的限制
- 线程池中的所有线程都是后台线程。如果进程的所有前台线程都结束了,所有的后台线程就会停止。不能把入池的线程改为前台线程。
- 不能给入池的线程设置优先级或名称。
- 对于COM对象,入池的所有线程都是多线程单元(Multithreaded
Apartment,MTA)线程。许多COM对象都需要单线程单元(Multithreaded Apartment,MTA)线程。 - 入池的线程只能用于时间较短的任务。如果线程要一直运行(如Word的拼写检查器线程),就应使用Thread类创建一个线程。
NET 4.0 Task用法
System.Threading.Tasks的作用:
Tasks命名空间下的类试图使用任务的概念来解决线程处理的复杂问题。任务(Task)包含一个操作,以及依赖哪个任务的完成才能开始。
测试用例:
假设有任务A,B,C,D。其中C依赖A和B的完成,而D依赖A的完成。代码该怎么写呢?
代码:
TaskFactory factory = new TaskFactory(); Task a = factory.StartNew((new TestAction("A", 2)).Do); Task b = factory.StartNew((new TestAction("B", 5)).Do); Task c = factory.ContinueWhenAll(new Task[] { a, b }, ((preTasks) => (new TestAction("C",1)).Do())); Task d = factory.ContinueWhenAll(new Task[] { a }, ((preTasks) => (new TestAction("D",1)).Do()));
- Winform开发中耗时操作封装用异步执行(.net 4.0)
- 在Winform中使用C#异步优化耗时操作
- AsyncTask异步执行耗时操作
- 【Android 开发教程】在服务中执行耗时操作
- Service中是否可以执行耗时操作
- 如何在 BroadcastReceiver 中执行耗时操作?
- Thread+Handler异步执行耗时操作更新UI线程界面
- 第一讲-------------执行后台耗时操作的封装
- 执行后台耗时操作的封装-----改进版
- Volley执行耗时操作
- Asp.Net Page_Load执行耗时操作,防止页面长时间加载。
- thinkphp 异步访问耗时操作
- Android中实现执行耗时操作时弹出进度对话框
- Oracle 分开执行耗时操作
- BackgroundWorker 组件用来执行诸如数据库事务、文件下载等耗时的异步操作
- c# 进度条BackgroundWorker 组件用来执行诸如数据库事务、文件下载等耗时的异步操作
- Java模拟耗时任务异步执行
- Winform异步解决窗体耗时操作(Action专门用于无返回值,Func专门用于有返回值)
- python读取MNIST数据集
- Spring Boot——2分钟构建spring web mvc REST风格HelloWorld
- Hibernate+struts代码优化(五)
- [UVa232]Crossword Answers用两个数组解决问题
- HDU 6097 Mindis(反演)
- Winform开发中耗时操作封装用异步执行(.net 4.0)
- 欢迎使用CSDN-markdown编辑器
- java面试
- 用canvas画能走的钟
- 正则表达式
- ios-GCD和NSOperation的区别
- iOS持久化Cookies与清空(可以用来保存登陆状态和退出登陆)
- HDU1116 欧拉回路 解题报告
- js生成六位验证码!