QueueUserWorkItem
是Windows API中的一个函数,用于将工作项排队到线程池中执行。它是.NET中ThreadPool.QueueUserWorkItem
方法的基础实现。
QueueUserWorkItem
是异步执行的,调用后立即返回,不等待工作项完成。如果需要等待所有排队的工作项完成,需要额外的同步机制。
using System;
using System.Threading;
class Program
{
static void Main()
{
int workItems = 5;
ManualResetEvent[] doneEvents = new ManualResetEvent[workItems];
for (int i = 0; i < workItems; i++)
{
doneEvents[i] = new ManualResetEvent(false);
ThreadPool.QueueUserWorkItem(new WaitCallback(DoWork), doneEvents[i]);
}
// 等待所有工作项完成
WaitHandle.WaitAll(doneEvents);
Console.WriteLine("所有工作项已完成");
}
static void DoWork(object state)
{
ManualResetEvent doneEvent = (ManualResetEvent)state;
try
{
// 执行实际工作
Console.WriteLine("工作项正在执行...");
Thread.Sleep(1000); // 模拟工作
}
finally
{
doneEvent.Set();
}
}
}
using System;
using System.Threading;
class Program
{
static void Main()
{
int workItems = 5;
CountdownEvent countdown = new CountdownEvent(workItems);
for (int i = 0; i < workItems; i++)
{
ThreadPool.QueueUserWorkItem(state =>
{
try
{
Console.WriteLine("工作项正在执行...");
Thread.Sleep(1000); // 模拟工作
}
finally
{
countdown.Signal();
}
});
}
countdown.Wait();
Console.WriteLine("所有工作项已完成");
}
}
using System;
using System.Threading.Tasks;
class Program
{
static void Main()
{
int workItems = 5;
Task[] tasks = new Task[workItems];
for (int i = 0; i < workItems; i++)
{
tasks[i] = Task.Run(() =>
{
Console.WriteLine("工作项正在执行...");
Task.Delay(1000).Wait(); // 模拟工作
});
}
Task.WaitAll(tasks);
Console.WriteLine("所有工作项已完成");
}
}
WaitHandle.WaitAll
在Windows上有64个等待句柄的限制ThreadPool.QueueUserWorkItem
已被Task.Run
等更现代的API部分取代线程池工作项的排队和执行有一定开销,对于非常小的任务,串行执行可能更快。建议对任务进行基准测试以确定最佳方法。
没有搜到相关的文章