线程之异步委托
2014-03-05 14:43
141 查看
http://www.cnblogs.com/lvcy/archive/2012/06/14/2548695.html
线程:是程序中独立的指令流。在我们熟悉的Visual Studio编辑器中输入C# 代码的时候,系统会自动分析代码,提示你输入的代码出现的各种错误,这是一个后台线程完成的。
创建线程的一种简单的方式就是定义一个委托,并一部调用它。Delegate类支持异步调用方法,在后台,Delegate类会创建一个执行任务的线程。
为了说明委托的异步性,从一个需要一定时间的方法讨论,方法如下所示:
TakesAWhile方法需要两个ms毫秒后才能执行完成。
需要从委托中调用TakesAWhile方法,需要定义一个相同参数和返回值类型的委托,如下面的代码所示:
当然我们还可以直接使用Func<int,int,int>来引用TakesAWhile方法。
Delegate类提供了BeginInvoke()方法和EndInvoke()方法。BeginInvoke()方法可以传递委托类型定义的输入参数。BeginInvoke()方法是有返回值的,返回值为IasyncResult,通过IasyncResult,我们可以获取该委托的相关信息,并检验该委托是否完成了相关的任务,从而我们就需要使用IasyncResult的IsCompleted方法来检验委托是否已经完成了任务。从EndInvoke()方法获取委托执行完成后的返回值。BeginInvoke()方法没有执行完之前,EndInvoke()方法就会一直被阻塞。从下面的代码运行结果可以看出,只要委托还没有完成任务,程序的主线程就会继续执行while循环。
代码示例:
运行结果:
线程:是程序中独立的指令流。在我们熟悉的Visual Studio编辑器中输入C# 代码的时候,系统会自动分析代码,提示你输入的代码出现的各种错误,这是一个后台线程完成的。
创建线程的一种简单的方式就是定义一个委托,并一部调用它。Delegate类支持异步调用方法,在后台,Delegate类会创建一个执行任务的线程。
为了说明委托的异步性,从一个需要一定时间的方法讨论,方法如下所示:
static int TakesAWhile(int data, int ms) { Console.WriteLine("TakesAWhile start"); Thread.Sleep(ms); Console.WriteLine("TakesAWhile completed"); return ++data; }
TakesAWhile方法需要两个ms毫秒后才能执行完成。
需要从委托中调用TakesAWhile方法,需要定义一个相同参数和返回值类型的委托,如下面的代码所示:
public delegate int TakesAWhileDelegate(int data, int ms);
当然我们还可以直接使用Func<int,int,int>来引用TakesAWhile方法。
Delegate类提供了BeginInvoke()方法和EndInvoke()方法。BeginInvoke()方法可以传递委托类型定义的输入参数。BeginInvoke()方法是有返回值的,返回值为IasyncResult,通过IasyncResult,我们可以获取该委托的相关信息,并检验该委托是否完成了相关的任务,从而我们就需要使用IasyncResult的IsCompleted方法来检验委托是否已经完成了任务。从EndInvoke()方法获取委托执行完成后的返回值。BeginInvoke()方法没有执行完之前,EndInvoke()方法就会一直被阻塞。从下面的代码运行结果可以看出,只要委托还没有完成任务,程序的主线程就会继续执行while循环。
代码示例:
class Program
{
static void Main(string[] args)
{
Func<int, int, int> d1 = TakesAWhile;//声明委托并应用方法
IAsyncResult ar = d1.BeginInvoke(1, 3000, null, null);//给引用的方法传值并返回数据类型为IAsyncResult的返回值
int i = 0;
while (!ar.IsCompleted)//判断委托的任务是否执行完成,若执行完成,跳出循环
{
Console.Write(i+++" ");
Thread.Sleep(50);//每50毫秒检查一次
}
int result = d1.EndInvoke(ar);//从EndInvoke()方法中获取委托执行的返回值
Console.WriteLine("Result:{0}",result);//输出返回结果
}
static int TakesAWhile(int data, int ms) { Console.WriteLine("TakesAWhile start"); Thread.Sleep(ms); Console.WriteLine("TakesAWhile completed"); return ++data; }
}
运行结果:
相关文章推荐
- c#利用委托进行异步跨线程加载到窗体数据
- 线程 委托 同步异步 的运用
- 创建线程之异步委托
- [2014-9-15]异步委托线程高级
- 用委托在listbox中异步显示信息,解决线程间操作无效,从不是创建控件的线程访问它
- C#中的线程一(委托中的异步)
- C#基础:线程之异步委托
- 第一节:复习委托,并且通过委托的异步调用开启一个新线程和异步回调、异步等待。
- C#基础:线程之异步回调(委托)
- Unity之C#——异步委托开启线程,三种方法检测结束
- 今日学习:关于C#多线程之一——异步委托
- 关于C#多线程之一——异步委托
- 【转】谈.Net委托与线程——创建无阻塞的异步调用
- vb.net的异步读写数据流(使用线程、委托)
- vb.net的异步读写数据流(使用线程、委托)
- 第四十三讲:线程通信与异步委托
- 谈.Net委托与线程——创建无阻塞的异步调用
- 异步委托跨线程访问控件解决界面卡死
- (二)线程--通过委托异步调用方法
- C# :线程中操作多控件 (委托实现异步及同步的方法)