您的位置:首页 > 编程语言 > C#

C#在线程池中调用委托

2016-03-02 21:11 489 查看
在线程池中调用线程,同时启用超时等待。

可应场景:发送信号,等待回复;收到回复->回复处理;未收到回复->超时处理

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);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: