C 多執行緒 非同步執行緒 執行緒池相關知識

2021-07-22 15:17:35 字數 3554 閱讀 1661

/*

執行緒池threadpool類會在需要時增減池中線程的執行緒數,直到最大的執行緒數。池中的最大執行緒數是可配置的。

在雙核cpu中,預設設定為1023個工作執行緒和1000個i/o執行緒。也可以指定在建立執行緒池時應立即啟動的最小執行緒數,

以及執行緒池,中可用的最大執行緒數。如果有更多的作業要處理,執行緒池中線程的個數也到了極限,

最新的作業就要排隊,且必須等待執行緒完成其任務。

*///下面這個方法是乙個符合waitcallback委託的方法:

static void waitcallbackmethod(object param)

is running", param));

thread.sleep(1000);

}}//然後在主線程裡給執行緒池新增方法,queueuserworkitem()方法的第二個引數是個object型別的引數,可傳入乙個資料到執行緒中

static void main(string args)

console.read();}/

//task任務

1、task類建構函式

使用task類的建構函式。例項化task物件時,任務不會立即執行,而是指定created狀態。

接著呼叫task類的start()方法來啟動任務。

使用task類時,除了呼叫start()方法,還可以呼叫runsynchronously()方法。

這樣,任務也會啟動,但是同時呼叫。預設情況下,任務是非同步執行的。

task類的建構函式接收乙個無參無返回值的委託:

task task = new task(taskmethod);

task.start();

下面是taskmethod方法:

static void taskmethod()

", task.currentid));

thread.sleep(500);

}}方法裡用task.currentid屬性取得當前任務id。下面是主線程:

static void main(string args)

console.read();

}如果要往執行緒裡傳遞引數,task建構函式提供的過載,可以傳入乙個object型別的引數:

task task = new task(taskmethodwithparameter, "hello world");

task.start();

下面是帶參的執行緒方法:

static void taskmethodwithparameter(object param)

", param));

thread.sleep(500);

}}2、taskfactory類

使用例項化的taskfactory類,在其中把taskmethod方法傳遞給startnew()方法,就會立即啟動任務。

taskfactory tf = new taskfactory();

tf.startnew(taskmethod);

3、task.factory屬性

task類提供了乙個factory靜態屬性,這個屬性返回乙個taskfactory物件。

task task = task.factory.startnew(taskmethod);

///c#非同步程式設計的實現方式——連續任務

通過任務,可以指定在任務完成後,應開始執行另乙個特定任務。任務處理程式或者不帶引數或者帶乙個物件引數,而連續處理程式有乙個task型別的引數。下面先定義兩個任務:

static void firsttaskmethod()

is doing something", task.currentid));

thread.sleep(200);}

static void secondtaskmethod(task task)

is doing something", task.currentid));

thread.sleep(200);

}連續任務通過在任務上呼叫continuewith()方法來現實:

static void main(string args)

console.read();

}主線程迴圈輸出字串到控制台,task1任務在另外乙個執行緒裡執行,firsttaskmethod執行完繼續secondtaskmethod

值得注意的是,在乙個任務結束時,可以啟動多個任務,也就是說,任務的連線可以像乙個樹結構那樣,如下**:

task task1 = new task(firsttaskmethod);

task task2 = task1.continuewith(secondtaskmethod);

task task3 = task1.continuewith(secondtaskmethod);

task task4 = task2.continuewith(secondtaskmethod);

task task5 = task2.continuewith(secondtaskmethod);

無論前乙個任務是如何結束的,後面的連續任務總是在前乙個任務結束時啟動。

taskcontinuationoptions列舉提供了onlyonfaulted,notonfaulted,onlyoncanceled,

notoncanceled,onlyonruntocompletion幾個選項。我們可以指定只有當前乙個任務成功結束時才啟動:

task task5 = task2.continuewith(secondtaskmethod, taskcontinuationoptions.onlyonrantocompletion);

///c#非同步程式設計的實現方式——層次任務

任務也可以構成乙個層次結構。乙個任務啟動乙個新任務時,就啟動了乙個層次結構。

下面的**段在父任務內部新建乙個任務。建立子任務的**與建立父任務的**相同,

唯一的區別是這個任務從另乙個任務內部建立:

static void main(string args)

static void parenttask()

static void childtask()

//////

using microsoft.visualstudio.testtools.unittesting;

using system.collections.generic;

using system.threading;

using system.threading.tasks;

namespace ex.rulestester.threads

assert.istrue(true);

}/// /// 對於 task 多工執行的封裝

///

private class tasktest

}private tasktest()

public static void runtask()

//非同步等待所有任務執行完畢

task.factory.startnew(x =>

, null);

}private static void dotask(object par)}}

}}

多執行緒 執行緒池相關

銀行有四個視窗辦業務,好比四個cpu。如果只開乙個執行緒的話,相當於所有辦業務的人都排成一隊在乙個視窗辦業務,或者說每個人都必須等上乙個人辦完業務之後隨機選乙個視窗,總之就是序列乙個個來。所以這體現了多執行緒優點的就是可以充分利用現在計算機配置多核cpu的硬體特性,把多核cpu利用起來提高任務的處理...

執行緒池ThreadPool實現非同步多執行緒

threadpool執行緒池的主要方法 1.public static boolean queueuserworkitem waitcallback wc,object state waitcallback 函式 通過將一些 函式放入執行緒池中讓其形成佇列,然後執行緒池會自動建立或者復用執行緒去執行...

c 執行緒池 多執行緒

1。設定引數類 using system using system.collections.generic using system.text public class stateinfo 執行緒開啟方法類 using system using system.collections.generic ...