using System;
using System.Threading;
namespace zuo_Company.MyThreadDelegateProject
{
public delegate int ThreadRun(int count,int ms);
public class TestMain
{
static void Main(string[] args)
{
ThreadRun tr = Total; //初始化委托变量
//异步调用,第一式:投票
IAsyncResult iar = tr.BeginInvoke(1,3000,null,null);
while (!iar.IsCompleted)
{
Console.Write("."); //先主线程Main()输出了一个".",然后才启动的委托方法
Thread.Sleep(50);
}
int result = tr.EndInvoke(iar);
Console.WriteLine("result:{0}",result);
Console.WriteLine();
//异步调用,第二式:等待句柄
IAsyncResult iaa = tr.BeginInvoke(1, 3000, null, null);
while (true)
{
Console.Write(".");
if (iaa.AsyncWaitHandle.WaitOne(50, false)) //先启动的委托方法tr=>Total();然后才进入主线程Main()输出"."
{
Console.WriteLine("等待句柄。");
break;
}
}
//iaa.AsyncWaitHandle.WaitOne(80, false);
int result_a = tr.EndInvoke(iaa);
Console.WriteLine("result_a:{0}", result_a);
Console.WriteLine();
//异步调用,第三式:异步回调
tr.BeginInvoke(8, 3000, CallBack, tr); //交替输出,线程时间片轮换
for (int i = 0; i < 1000; i++) //主线程Main()方法
{
Console.Write(".");
}
Console.Read();
}
static int Total(int count, int ms)
{
Console.WriteLine("运行线程方法:");
//Thread.Sleep(ms);
for (int i = 0; i < 10000; i++)
{
Console.Write("*");
}
Console.WriteLine("Thread Method is Over!");
return ++count;
}
//异步回调
static void CallBack(IAsyncResult ar)
{
Console.WriteLine(ar.AsyncState.ToString());
ThreadRun tt = ar.AsyncState as ThreadRun;
int ret = tt.EndInvoke(ar);
Console.WriteLine("CallBack result:{0}",ret);
}
}
}
----------------------------------------------------------------------------------------------------
using System;
using System.Threading;
public class AsyncDemo {
public string TestMethod(int callDuration, out int threadId) {
Console.WriteLine("Test method begins.");
Thread.Sleep(callDuration);
threadId = AppDomain.GetCurrentThreadId();
return "MyCallTime was " + callDuration.ToString();
}
}
public delegate string AsyncDelegate(int callDuration, out int threadId);
public class AsyncMain {
private static int threadId;
static void Main(string[] args) {
AsyncDemo ad = new AsyncDemo();
AsyncDelegate dlgt = new AsyncDelegate(ad.TestMethod);
IAsyncResult ar = dlgt.BeginInvoke(3000,out threadId,CallbackMethod,dlgt );
Console.WriteLine("Press Enter to close application.");
Console.ReadLine();
}
static void CallbackMethod(IAsyncResult ar) {
AsyncDelegate dlgt = (AsyncDelegate) ar.AsyncState;
string ret = dlgt.EndInvoke(out threadId, ar);
Console.WriteLine("The call executed on thread {0}, with return value \"{1}\".", threadId, ret);
}
}
|