日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C# 线程池和编程实例

發布時間:2025/4/14 C# 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C# 线程池和编程实例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

C# 線程池和編程實例
一?
? ? 線程池可以看做容納線程的容器;
? ? 一個應用程序最多只能有一個線程池;
? ? ThreadPool靜態類通過QueueUserWorkItem()方法將工作函數排入線程池;
? ? 每排入一個工作函數,就相當于請求創建一個線程;


? ? 線程池的作用:
? ? 線程池是為突然大量爆發的線程設計的,通過有限的幾個固定線程為大量的操作服務,減少了創建和銷毀線程所需的時間,從而提高效率。
? ? 如果一個線程的時間非常長,就沒必要用線程池了(不是不能作長時間操作,而是不宜。),況且我們還不能控制線程池中線程的開始、掛起、和中止。


? ? 你可以通過 System.Threading 名稱空間的 Thread Pool 類 來使用線程池,如果你查看一下這個類,就會發現所有的成員都是靜態的,而且沒有公開的構造函數。這是有理由這樣做的,因為每個進程只有一個線程池,并且我 們不能創建新的。這個限制的目的是為了把所有的異步編程技術都集中到同一個池中。所以我們不能擁有一個通過第三方組建創建的無法管理的線程池。


二 實例


? ? 程序運行結果截圖;


?

?

?

? ? 碼碼如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;


//public delegate void WaitCallback(Object state);


namespace ThreadPool1
{
? ? public partial class Form1 : Form
? ? {


? ? ? ? static double number1 = -1;
? ? ? ? static double number2 = -1;
? ? ? ? // 函數變量值
? ? ? ? int x = 18808;


? ? ? ? public Form1()
? ? ? ? {
? ? ? ? ? ? InitializeComponent();
? ? ? ? }


? ? ? ? void Draw1(string str1, int xPos = 0, int yPos = 0)
? ? ? ? {
? ? ? ? ? ? SolidBrush aBrush = new SolidBrush(Color.Blue);
? ? ? ? ? ? Font aFont = new Font("Arial", 8, FontStyle.Bold, GraphicsUnit.Millimeter);


? ? ? ? ? ? Graphics graphic = this.CreateGraphics();
? ? ? ? ? ? graphic.DrawString(str1, aFont, aBrush, xPos, yPos);
? ? ? ? }


? ? ? ? void ClsFrm()
? ? ? ? {
? ? ? ? ? ? Graphics graphic = this.CreateGraphics();
? ? ? ? ? ? graphic.Clear(this.BackColor);
? ? ? ? }


? ? ? ? private void button1_Click(object sender, EventArgs e)
? ? ? ? {
? ? ? ? ? ? int maxThreadNum, portThreadNum;
? ? ? ? ? ? int minThreadNum;
? ? ? ? ? ? ThreadPool.GetMaxThreads(out maxThreadNum, out portThreadNum);
? ? ? ? ? ? ThreadPool.GetMinThreads(out minThreadNum, out portThreadNum);
? ? ? ? ? ? ClsFrm();
? ? ? ? ? ? Draw1("最大線程數:" + maxThreadNum.ToString(), 100, 100);
? ? ? ? ? ? Draw1("最小空閑線程數:" + minThreadNum.ToString(), 100, 130);
? ? ? ? }


? ? ? ? private void button2_Click(object sender, EventArgs e)
? ? ? ? {
? ? ? ? ? ? // 啟動第一個任務:計算x的8次方
? ? ? ? ? ? ClsFrm();
? ? ? ? ? ? Draw1("啟動第一個任務:計算18808的8次方。", 100, 100);
? ? ? ? ? ? ThreadPool.QueueUserWorkItem(new WaitCallback(TaskProc1), x); ? ?
? ? ? ? }


? ? ? ? private void button3_Click(object sender, EventArgs e)
? ? ? ? {
? ? ? ? ? ? // 啟動第二個任務:計算x的8次方根
? ? ? ? ? ? ClsFrm();
? ? ? ? ? ? Draw1("啟動第二個任務:計算18808的8次方根。", 100, 100);
? ? ? ? ? ? ThreadPool.QueueUserWorkItem(new WaitCallback(TaskProc2), x);
? ? ? ? }


? ? ? ? private void button4_Click(object sender, EventArgs e)
? ? ? ? {
? ? ? ? ? ? // 等待,直到兩個數值都完成計算
? ? ? ? ? ? while (number1 == -1 || number2 == -1) ;


? ? ? ? ? ? // 打印計算結果
? ? ? ? ? ? ClsFrm();
? ? ? ? ? ? Draw1(number1.ToString() + " ? ?" + number2.ToString(), 100, 100);
? ? ? ? }


? ? ? ? // 啟動第一個任務:計算x的8次方
? ? ? ? ?static void TaskProc1(object o)
? ? ? ? {
? ? ? ? ? ? number1 = Math.Pow(Convert.ToDouble(o), 8);
? ? ? ? }


? ? ? ? // 啟動第二個任務:計算x的8次方根
? ? ? ? static void TaskProc2(object o)
? ? ? ? {
? ? ? ? ? ? number2 = Math.Pow(Convert.ToDouble(o), 1.0 / 8.0);
? ? ? ? }
? ? }




}


? ? 代碼要點:
? ? 引入命名空間:using System.Threading;

? ? 這兩個函數偶自制,用于在窗體上顯示內容和清除顯示;
void Draw1(string str1, int xPos = 0, int yPos = 0)
void ClsFrm()

? ? ThreadPool.QueueUserWorkItem(new WaitCallback(TaskProc1), x);
? ? TaskProc1是線程的執行函數,

? ? ThreadPool.QueueUserWorkItem 方法:
? ? 將方法排入隊列以便執行,并指定包含該方法所用數據的對象。 此方法在有線程池線程變得可用時執行。
? ? public static bool QueueUserWorkItem(
WaitCallback callBack,
Object state
? ? )
? ? 參數:
? ? callBack ? ?類型:System.Threading.WaitCallback ? ?WaitCallback ,它表示要執行的方法。
? ? state ? ?類型:System.Object ? ?包含方法所用數據的對象。
? ? 返回值 ? ?類型:System.Boolean ? ?如果此方法成功排隊,則為 true;如果無法將該工作項排隊,則引發 NotSupportedException。
? ??

總結

以上是生活随笔為你收集整理的C# 线程池和编程实例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。