在线程池中调用线程,同时启用超时等待。
可应场景:发送信号,等待回复;收到回复->回复处理;未收到回复->超时处理
using System;
using System.Threading;
namespace InvokingADelegate
{
class Program
{
static void Main(string[] args)
{
int threadId = 0;
RunOnThreadPool poolDelegate = Test;
var t = new Thread(() => Test(out threadId));
t.Start();
t.Join();
Console.WriteLine("thread id: {0}", threadId);
//回调函数在委托函数调用结束后开始
IAsyncResult r = poolDelegate.BeginInvoke(out threadId, Callback, "a delegate asynchronous call");
//等待,直到线程结束
r.AsyncWaitHandle.WaitOne();
//while(!r.AsyncWaitHandle.WaitOne(TimeSpan.FromSeconds(0.1)))
//{
// Console.Write("*");
//}
//获取线程运行结束后的结果
string result = poolDelegate.EndInvoke(out threadId, r);
Console.WriteLine("thread pool worker thread id: {0}", threadId);
Console.WriteLine(result);
Thread.Sleep(TimeSpan.FromSeconds(2));
Console.ReadKey();
}
private delegate string RunOnThreadPool(out int threadId);
private static void Callback(IAsyncResult ar)
{
Console.WriteLine("starting a callback...");
Thread.Sleep(TimeSpan.FromSeconds(2));
Console.WriteLine("starting passed to a callback:{0}", ar.AsyncState);
Console.WriteLine("is thread pool thread: {0}", Thread.CurrentThread.IsThreadPoolThread);
Console.WriteLine("thread pool worker thread id: {0}", Thread.CurrentThread.ManagedThreadId);
}
private static string Test(out int threadId)
{
Console.WriteLine("starting...");
Console.WriteLine("is thread pool thread: {0}", Thread.CurrentThread.IsThreadPoolThread);
Thread.Sleep(TimeSpan.FromSeconds(2));
threadId = Thread.CurrentThread.ManagedThreadId;
return string.Format("thread pool worker thread id was:{0}", threadId);
}
}
}