多线程(1-3)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace Multithreading
{
class Program
{
public delegate int TakesAWhileDelegate(int data, int ms); //定义委托
static void Main(string[] args)
{
TakesAWhileDelegate d1 = TasksAWhile;
IAsyncResult ar = d1.BeginInvoke(1,50,null,null); //异步委托
#region 投票
//while (!ar.IsCompleted) //只要委托没有完成其任务,程序的主线程就继续执行while循环
//{
// //doing something else in the main thread
// Console.Write(".");
// Thread.Sleep(50);
// for (int i = 0; i <= 10000; i++)
// {
// Console.Write("-");
// }
//}
#endregion
#region 等待句柄 这是另一种等待方式
// waitone() 将一个超时时间作为可选的第一参数,在其中可以定义要等待的最长时间,如果发生超时,waitone()方法就会返回false
//while 循环会继续执行。如果等待操作成功,就用一个中断退出循环,用委托的EndInvoke()方法接收结果。
while(true)
{
Console.WriteLine(".");
if(ar.AsyncWaitHandle.WaitOne(5000,false))
{
Console.WriteLine("Can get the result now");
break;
}
}
#endregion
//***如果在委托结束之前不等待委托完成其任务就结束主线程,委托线程就会停止
int result = d1.EndInvoke(ar); //这是委托类型的一个方法,直到委托完成其任务为止
Console.WriteLine("resulit={0}",result);
Console.ReadLine();
}
public static int TasksAWhile(int data,int ms)
{
Console.WriteLine("TakesAWhile started");
// Thread.Sleep(ms);
for (int i = 0; i < 500; i++)
{
Thread.Sleep(ms);
Console.Write("*");
}
Console.WriteLine("TakesAWhile completed");
return ++data;
}
}
}
运行结果: