Loading...

学习和积累有关asp.net, .net core, asp.net core的知识,在编程中找寻乐趣!

当前位置:首页DotNet

有关ThreadPool.QueueUserWorkItem的一些用法

发布时间:2024-09-24 16:55
有关ThreadPool.QueueUserWorkItem的一些用法

有关ThreadPool.QueueUserWorkItem的一些用法, 

以下示例使用 QueueUserWorkItem(WaitCallback) 方法重载将任务(由 ThreadProc 方法表示)排队,以在线程可用时执行。 此重载未提供任何任务信息。 因此,方法可用的 ThreadProc 信息仅限于该方法所属的对象。


using System;
using System.Threading;
public class Example 
{
    public static void Main() 
    {
        //把任务加入队列
        ThreadPool.QueueUserWorkItem(ThreadProc);
        Console.WriteLine("Main thread does some work, then sleeps.");
        //人为等待1秒
        Thread.Sleep(1000);
        Console.WriteLine("Main thread exits.");
    }
    //要在线程内执行的任务
    static void ThreadProc(Object stateInfo) 
    {
        // No state object was passed to QueueUserWorkItem, so stateInfo is null.
        Console.WriteLine("Hello from the thread pool.");
    }
}
// The example displays output like the following:
//       Main thread does some work, then sleeps.
//       Hello from the thread pool.
//       Main thread exits.

以下示例使用 .NET 线程池来计算 Fibonacci 20 到 40 之间的五个数字的结果。 每个 Fibonacci 结果都由 Fibonacci 类表示,该类提供一个名为 ThreadPoolCallback 的方法,用于执行计算。 创建表示每个 Fibonacci 值的对象,并将 ThreadPoolCallback 方法传递给 QueueUserWorkItem,它分配池中的一个可用线程来执行此方法。

由于每个对象都有 Fibonacci 一个半随机值用于计算,并且每个线程都将争用处理器时间,因此无法提前知道计算所有五个结果需要多长时间。 这就是在构造期间为每个 Fibonacci 对象传递 ManualResetEvent 类的一个实例的原因。 每个对象在计算完成后向提供的事件对象发出信号,这样主线程就可以阻止执行 WaitAll ,直到所有五 Fibonacci 个对象都计算出一个结果。 然后 Main 方法会显示每个 Fibonacci 结果。

using System;
using System.Threading;
public class Fibonacci
{
    private ManualResetEvent _doneEvent;
    public Fibonacci(int n, ManualResetEvent doneEvent)
    {
        N = n;
        _doneEvent = doneEvent;
    }
    public int N { get; }
    public int FibOfN { get; private set; }
    public void ThreadPoolCallback(Object threadContext)
    {
        int threadIndex = (int)threadContext;
        Console.WriteLine($"Thread {threadIndex} started...");
        FibOfN = Calculate(N);
        Console.WriteLine($"Thread {threadIndex} result calculated...");
        _doneEvent.Set();
    }
    public int Calculate(int n)
    {
        if (n <= 1)
        {
            return n;
        }
        return Calculate(n - 1) + Calculate(n - 2);
    }
}
public class ThreadPoolExample
{
    static void Main()
    {
        const int FibonacciCalculations = 5;
        var doneEvents = new ManualResetEvent[FibonacciCalculations];
        var fibArray = new Fibonacci[FibonacciCalculations];
        var rand = new Random();
        Console.WriteLine($"Launching {FibonacciCalculations} tasks...");
        for (int i = 0; i < FibonacciCalculations; i++)
        {
            doneEvents[i] = new ManualResetEvent(false);
            var f = new Fibonacci(rand.Next(20, 40), doneEvents[i]);
            fibArray[i] = f;
            ThreadPool.QueueUserWorkItem(f.ThreadPoolCallback, i);
        }
        WaitHandle.WaitAll(doneEvents);
        Console.WriteLine("All calculations are complete.");
        for (int i = 0; i < FibonacciCalculations; i++)
        {
            Fibonacci f = fibArray[i];
            Console.WriteLine($"Fibonacci({f.N}) = {f.FibOfN}");
        }
    }
}
// The output is similar to:
// Launching 5 tasks...
// Thread 3 started...
// Thread 4 started...
// Thread 2 started...
// Thread 1 started...
// Thread 0 started...
// Thread 2 result calculated...
// Thread 3 result calculated...
// Thread 4 result calculated...
// Thread 1 result calculated...
// Thread 0 result calculated...
// All calculations are complete.
// Fibonacci(35) = 9227465
// Fibonacci(27) = 196418
// Fibonacci(25) = 75025
// Fibonacci(25) = 75025
// Fibonacci(27) = 196418


Dotnet Core设置程序启动端口 如何自定义启动端口

dotnet core 程序启动端口自定义,修改默认的5000端口的步骤,首先打开Program.cs文件,在 var builder =

Dotnet Core 判断是否是搜索引擎或百度蜘蛛来访 如何知道百度蜘蛛访问你的网站

Dotnet Core 判断是否是搜索引擎或百度蜘蛛来访 如何知道百度蜘蛛访问了你的网站, 通过 User-Agent来判断,看请求里是否包

NET中如何使用NLog日志输出到文本中 Nlog日志如何捕获异常

NET中如何使用NLog日志输出到文本中 Nlog日志如何捕获异常, 一、因我是在.net8里测试的 , 故我安装的是 NLog.Web.A

asp.net mvc项目中如果不使用asp-for直接为控件命名id-name时后台拿不到值的情况

当前台以js动态为id="aaa"赋值时(直接写值除外),上面 viewArticlenews 里面是拿不到aaa的值,当然这里说的不使用a

网站建设小程序开发前端样式编写积累style刷新回顶部css计算函数

使单个元素居中显示 小程序开发时的底部的安全区要留出来,样式如下 小程序开发添加右下角的刷新和回顶部两个按钮 css中使用计算函数

为只有table和tr及td元素的表格添加一个边框css样式这样写

为只有table和tr及td元素的表格添加一个边框css样式这样写, 适合快速给一个表格加样式,为表格快速添加细边框,表格含有table,t

C#.NETCORE文件上传到linux服务器时要注意的问题

C#.NETCORE文件上传到linux服务器时要注意的问题, 使用反斜杠和斜杠两个是有很大的区别的,最好使用 正斜杠,则不使用反斜杠,这样

DOTNET下使用正则使内容字段进行分段处理适合不分段的内容文本处理

DOTNET下使用正则使内容字段进行分段处理适合不分段的内容文本处理, 如果您的内容是一个整段,可以使用如下方法处理,使用条件:内容必须放在

提供免费的服务器维护、网站维护、宝塔面板的安装及运行。

网站编写代码分享

网站收录效果不好,自然会影响排名,网站优化首先第一步是要搞好网站收录

网络营销