using System;
using System.Threading;
using System.Collections.Generic;
using System.Windows.Forms; namespace AsyncDemo
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} class objstate //申明一个实体类
{
public string fname;
public string lname;
public DateTime birthday;
public objstate()
{
fname = "wang";
lname = "nima";
birthday = DateTime.Now;
}
public objstate(string fn, string ln)
{
fname = fn;
lname = ln;
//birthday = DateTime.Now;
}
} AsyncCallback callback;
objstate obj; #region easy demo
//申明委托
public delegate string deltest();
deltest begin;
private void button1_Click(object sender, EventArgs e)
{
begin = new deltest(method);
callback = new AsyncCallback(back);
obj = new objstate();//实例化类,该对象可以传入回调函数中
begin.BeginInvoke(back, obj);//异步执行method,界面不会假死,5秒后执行回调函数,弹出提示框
}
private void back(IAsyncResult ar)
{
string res = begin.EndInvoke(ar);
objstate obj = (objstate)(ar.AsyncState);//通过AsyncState获取传入的object
MessageBox.Show(res + "\n" + obj.fname + " " + obj.lname + " " + obj.birthday); } private string method()
{
Thread.Sleep(5000);
return "welcome to this world";
}
#endregion #region complex demo //申明委托
public delegate void deltest1();
deltest1 begin1;
public delegate string deltest2(List<string> list);
deltest2 begin2;
private void button2_Click(object sender, EventArgs e)
{
string id = Thread.CurrentThread.ManagedThreadId.ToString();
Thread.CurrentThread.Name = "MainThread";
richTextBox1.Text = "主线程线程ID:" + id + " 主线程名:" + Thread.CurrentThread.Name + "\n"; begin1 = new deltest1(method1);
callback = new AsyncCallback(back1); List<objstate> list = new List<objstate>();
for (int i = 0; i < 10; i++)
{
objstate obj = new objstate("James" + (i * i).ToString(), "Warke" + (i * 3).ToString());
list.Add(obj);
}
//delegate.BeginInvoke(parameter[] para, AsyncCallback callback, object obj)
//para是method方法的参数;
//callback是method方法执行完后在同一子线程中立即执行的回调函数;
//obj是一个可以传入回调函数中的object ,在回调函数中通过 IAsyncResult.AsyncState获取
begin1.BeginInvoke(back1, list); this.Location = new System.Drawing.Point(0, 0);
MessageBox.Show("主线程没有阻塞");
} private void back1(IAsyncResult ar)
{
begin1.EndInvoke(ar);
//回调函数中的线程ID与异步执行method时的线程ID相同,说明说明回调函数也是在子线程中执行
string id = Thread.CurrentThread.ManagedThreadId.ToString(); if (this.IsHandleCreated)
{
IAsyncResult iar = this.BeginInvoke(new Action(delegate()
{
richTextBox1.Text += "正在调用back函数 " + "当前线程ID:" + id + "\n";
}));
this.EndInvoke(iar);
}
List<objstate> list = (List<objstate>)(ar.AsyncState);//通过AsyncState获取传入的object
List<string> strList = new List<string>();
for (int i = 0; i < 10; i++)
{
Thread.Sleep(3000);
//winform中控件的属性设置或操作只能有主线程进行
//因此在子线程中需要调用 Control.BeginInvoke(Delegate method)方法 在主线程上对控件进行操作
//Control.BeginInvoke中传入的方法,应尽量只包含对控件操作的语句,这样主线程能够快速执行完对控件的操作,主界面不会假死
//Action<T>()是无返回值的泛型委托 Func<T>()是带返回值的泛型委托
//线程的执行有可能在窗口句柄创建完成前进行,此时会报错,因此 子线程中要异步操作主线程中的控件就需要在主线程的窗口句柄创建完成后进行
//句柄的类型是 IntPtr ,相当于windows中的身份证, 是一个指向指针的指针, 在内存中有固定的地址
//指针指向一块内存引用类或方法或程序集,不过内存中的地址会不断改变,系统需要通过一个指向指针的指针来记载数据地址的变更,便是句柄
if (this.IsHandleCreated)
{
IAsyncResult iar = this.BeginInvoke(new Action(delegate()
{
richTextBox1.Text += "正在调用back函数 " + "当前线程ID:" + id + " 正在给第" + (i + 1).ToString() + "个人赋值" + "\n";
}));
this.EndInvoke(iar);
}
DateTime now = DateTime.Now;
list[i].birthday = now;
string str = now.ToLongTimeString() + " " + list[i].fname + "." + list[i].lname;
strList.Add(str);
} begin2 = new deltest2(method2);
begin2.BeginInvoke(strList, back2, null);
}
private void back2(IAsyncResult ar)
{
//有返回值的方法,可以通过EndInvoke(IAsyncResult ar)方法获取返回值
string res = begin2.EndInvoke(ar);
//回调函数中的线程ID与异步执行method时的线程ID相同,说明说明回调函数也是在子线程中执行
string id = Thread.CurrentThread.ManagedThreadId.ToString(); if (this.IsHandleCreated)
{
IAsyncResult iar = this.BeginInvoke(new Action(delegate()
{
richTextBox1.Text += "正在调用back2函数 " + "当前线程ID:" + id + "\n";
}));
this.EndInvoke(iar); }
MessageBox.Show(res);
}
private void method1()
{
string id = Thread.CurrentThread.ManagedThreadId.ToString();
for (int i = 5; i > 0; i--)
{
Thread.Sleep(1000);
if (this.IsHandleCreated)
{
IAsyncResult iar = this.BeginInvoke(new Action(delegate()
{
richTextBox1.Text += "正在调用method方法 " + "当前线程ID:" + id + " " + i.ToString() + "秒后method方法,进入回调函数\n";
}));
this.EndInvoke(iar);
}
}
}
private string method2(List<string> list)
{
string id = Thread.CurrentThread.ManagedThreadId.ToString();
for (int i = 0; i < 10; i++)
{
Thread.Sleep(3000);
if (this.IsHandleCreated)
{
IAsyncResult iar = this.BeginInvoke(new Action(delegate()
{
richTextBox1.Text += "正在调用method2方法 " + "当前线程ID:" + id + "\n";
richTextBox1.Text += list[i] + "\n";
richTextBox1.Select(richTextBox1.TextLength, 0);
}));
this.EndInvoke(iar);
}
}
return "finish";
}
#endregion
}
}

  

AsyncCallback IAsyncResult的更多相关文章

  1. 异步编程(AsyncCallback委托,IAsyncResult接口,BeginInvoke方法,EndInvoke方法的使用小总结)

    http://www.cnblogs.com/panjun-Donet/archive/2009/03/03/1284700.html 让我们来看看同步异步的区别: 同步方法调用在程序继续执行之前需要 ...

  2. C# - 多线程 之 异步编程

    异步编程 同步编程,请求响应模型,同步化.顺序化.事务化. 异步编程,事件驱动模型,以 Fire and Forget 方式实现. 异步编程模式  -§- 异步编程模型 (APM) 模式: IAsyn ...

  3. .Net组件程序设计之异步调用

    .Net组件程序设计之异步调用 说到异步调用,在脑海中首先想到就是BeginInvoke(),在一些常用对象中我们也会常常见到Invoke()和BeginInvoke(), 要想让自己的组件可以被客户 ...

  4. C#异步方法的使用

    from:http://www.myext.cn/csharp/a_6765.html 也许业内很多高不成低不就的程序员都会对一些知识点会有些迷惑,原因是平常工作用的少,所以也就决定了你对这个事物的了 ...

  5. C#中的线程一(委托中的异步)

    C#中的线程一(委托中的异步) 一.同步委托 我们平时所用的委托以同步居多,我们编写一个方法和相关委托进行演示: publicdelegatevoid DoSomethingDelegate(stri ...

  6. 介绍开源的.net通信框架NetworkComms框架 源码分析(十四)StreamTools

    原文网址: http://www.cnblogs.com/csdev Networkcomms 是一款C# 语言编写的TCP/UDP通信框架  作者是英国人  以前是收费的 目前作者已经开源  许可是 ...

  7. (转) C#如何使用异步编程

    怎么使用异步,就是用委托进行处理,如果委托对象在调用列表中只有一个方法,它就可以异步执行这个方法.委托类有两个方法,叫做BeginInvoke和EndInvoke,它们是用来异步执行使用. 异步有三种 ...

  8. C#如何使用异步编程

    怎么使用异步,就是用委托进行处理,如果委托对象在调用列表中只有一个方法,它就可以异步执行这个方法.委托类有两个方法,叫做BeginInvoke和EndInvoke,它们是用来异步执行使用. 异步有三种 ...

  9. Socket Programming in C#--Getting Started

    Getting Started You can argue that one can overcome these shortcomings by multithreading meaning tha ...

随机推荐

  1. php常用函数总结2

    文件系统函数 函数名 描述 实例 输入 输出 操作 fopen() 打开文件或者 URL $handle = fopen("ftp://user:password@example.com/s ...

  2. linux IPC socket

    套接字是通讯端点的抽象 创建一个套接字 #include <sys/types.h> #include <sys/socket.h> int socket(int domain ...

  3. [NOIP模拟测试3] 建造游乐园 题解(欧拉图性质)

    Orz 出题人石二队爷 我们可以先求出有n个点的联通欧拉图数量,然后使它删或增一条边得到我们要求的方案 也就是让它乘上$C_n^2$ (n个点里选2个点,要么删边要么连边,选择唯一) 那么接下来就是求 ...

  4. 如何加大jvm的内存和tomcat的内存

    如何扩大jvm的内存和tomcat的内存,如何让项目没有用的值得到及时的回收和清理,java项目 最佳答案   修改 tomcat 的内存方式:修改 catalina.bat在set JAVA_OPT ...

  5. 输入流当中的read方法和readfully方法的区别与原理

    原文链接:https://blog.csdn.net/yangjingyuan/article/details/6151234?locationNum=3 DataInputStream类中的read ...

  6. Mysql DBA

    1 mysqldump: Error 2020: Got packet bigger than 'max_allowed_packet' bytes when dumping table `tb_co ...

  7. pefile解析PE格式

    import os,sys import pefile import pydasm import struct #print sys.argv def show_section(pe): print ...

  8. 牛客 Fruit Ninja 2018 ACM 上海大都会赛 (随机化算法)

    题目链接:Fruit Ninja 比赛链接:2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛 题目描述 Fruit Ninja is a juicy action game enjoyed ...

  9. Tomcat集群session复制与Oracle的坑。。

    问题描述 公司某个系统使用了tomcat自带的集群session复制功能,然后后报了一个oracle驱动包里面的连接不能被序列化的异常. 01-Nov-2017 16:45:26.653 SEVERE ...

  10. python接口自动化(delete请求)

    python接口自动化(delete请求) 一.delete请求的目的:删除资源 二.应用 导包:import requests 调用delete方法:requests.delete(url) 获取响 ...