class Program
{
// 使用BeginXXX/EndXXX和IAsyncResult对象的方式被称为异步编程模型(APM模式)
delegate string RunOnThreadPool(out int threadId);
static void Main(string[] args)
{
int threadId = 0;
// 给委托变量赋值
RunOnThreadPool poolDelegate = Test;
var t = new Thread(() => { Test(out threadId); });
t.Start();
t.Join();
Console.WriteLine($"1.返回的线程Id:{threadId}");
// 通过调用委托变量的BeginInvoke方法来运行委托(执行Test方法)
IAsyncResult ar = poolDelegate.BeginInvoke(out threadId, Callback, "异步委托调用");
ar.AsyncWaitHandle.WaitOne();
// 调用委托的EndInvoke会等待异步操作(Test方法)完成
// 异步操作执行完成之后,开始执行回掉函数;异步操作和回掉函数很可能会被线程池中同一个工作线程执行
string result = poolDelegate.EndInvoke(out threadId, ar);
Console.WriteLine($"2.返回的线程Id:{threadId}");
Console.WriteLine($"返回值:{result}");
Console.ReadKey();
}
static void Callback(IAsyncResult ar)
{
Console.WriteLine("开始执行回掉函数...");
Console.WriteLine($"异步状态:{ar.AsyncState}");
Console.WriteLine($"是否为线程池中的线程:{Thread.CurrentThread.IsThreadPoolThread}");
Console.WriteLine($"线程池工作线程Id:{Thread.CurrentThread.ManagedThreadId}");
}
static string Test(out int threadId)
{
Console.WriteLine("开始测试方法...");
Console.WriteLine($"是否为线程池中的线程:{Thread.CurrentThread.IsThreadPoolThread}");
Thread.Sleep(TimeSpan.FromSeconds(2));
threadId = Thread.CurrentThread.ManagedThreadId;
return $"线程Id:{threadId}";
}
}
向线程池中放入异步操作
class Program
{
static void Main(string[] args)
{
ThreadPool.QueueUserWorkItem(AsyncOperation);
Thread.Sleep(TimeSpan.FromSeconds(2));
ThreadPool.QueueUserWorkItem(AsyncOperation, "async state");
Thread.Sleep(TimeSpan.FromSeconds(2));
ThreadPool.QueueUserWorkItem(state =>
{
Console.WriteLine($"操作状态:{state}");
Console.WriteLine($"工作线程Id:{Thread.CurrentThread.ManagedThreadId}");
Thread.Sleep(TimeSpan.FromSeconds(2));
}, "lambda state");
const int x = 1;
const int y = 2;
const string lambdaState = "lambda state 2";
// 使用闭包机制,无需传递lambda表达式的状态参数
ThreadPool.QueueUserWorkItem(_ =>
{
Console.WriteLine($"操作状态:{x + y},{lambdaState}");
Console.WriteLine($"工作线程Id:{Thread.CurrentThread.ManagedThreadId}");
Thread.Sleep(TimeSpan.FromSeconds(2));
});
Console.ReadKey();
}
static void AsyncOperation(object state)
{
Console.WriteLine($"操作状态:{state ?? "(null)"}");
Console.WriteLine($"工作线程Id:{Thread.CurrentThread.ManagedThreadId}");
Thread.Sleep(TimeSpan.FromSeconds(2));
}
}
线程池与并行度:
来源:oschina
链接:https://my.oschina.net/u/4304562/blog/4296621