當前位置:成語大全網 - 書法字典 - C#大數據量問題

C#大數據量問題

樓主可能不太熟悉多線程。首先,大量要處理的數據必須放到主線程之外的其他工作線程中,以響應界面的點擊、刷新、更新進度條等等。換句話說,主線程用於創建表單、更新表單和其他用戶界面操作。

以下為他人轉載。這樣的材料太多了。其實仔細看材料很簡單。

參考資料中的內容非常詳細。

壹、線程簡介

通常C#程序只有壹個線程。這個線程從主方法的執行開始,在主方法的執行結束時結束。Main直接或間接執行的每個命令都是由默認線程(或主線程)執行的,當Main返回時這個線程也會被終止。但是,您可以創建工作線程來與主線程並行執行代碼。這些線程通常被稱為“工作線程”。

輔助線程可用於執行耗時或時間關鍵的任務,而不會占用主線程。例如,在服務器應用程序中,工作線程通常用於響應傳入的請求,而不等待前面的請求完成。工作線程還可以用於執行桌面應用程序中的“後臺”任務,以便主線程(用於驅動用戶界面元素)保持對用戶操作的響應。

多線程解決了吞吐量和響應性的問題,但同時也帶來了資源享用的問題,比如死鎖和爭用狀態。多線程特別適合需要不同資源的任務,例如文件句柄和網絡連接。將多個線程分配給單個資源可能會導致同步問題,線程會被頻繁阻塞以等待其他線程,這與使用多線程的初衷背道而馳。

常見的策略是使用輔助線程來執行耗時或時間關鍵的任務,並且不會占用其他線程使用的大量資源。事實上,程序中的壹些資源必須被多個線程訪問。考慮到這些情況,系統。線程命名空間提供了用於同步線程的類。這些類包括互斥、監控、互鎖、自動重置事件和手動重置事件。

您可以使用這些類中的部分或全部來同步多個線程的活動,但是C#語言提供了壹些多線程支持。例如,C#中的Lock語句通過隱式使用Monitor來提供同步。

第二,線程的生命周期

第三,與線程相關的類

和C#相關的類都在系統裏。線程命名空間,它提供了壹些支持多線程編程的類和接口。除了同步線程活動和訪問數據的類(互斥、監控、互鎖、自動重置事件等)。),這個命名空間還包含壹個ThreadPool類(允許用戶使用系統提供的線程池)和壹個Timer類(在線程池線程上執行回調方法)。

1.線程:創建和控制線程,設置它們的優先級並獲取它們的狀態。最常用的方法如下:

Sleep():在指定的毫秒數內阻塞當前線程。

Abort (): ThreadAbortException在調用此方法的線程上引發,以啟動終止此線程的進程。調用此方法通常會終止線程。

Join():阻塞調用線程,直到線程終止。

Start():使線程能夠按計劃執行。

註意Suspend()是壹個掛起的線程,Resume()是壹個繼續掛起的線程。這兩種方法都有風險,不推薦。詳情請參考MS的相關文檔。

Thread類的通用屬性如下:

CurrentThread:獲取當前運行的線程。

IsAlive:獲取壹個值,該值指示當前線程的執行狀態。

Name:獲取或設置線程的名稱。

Priority:獲取或設置指示線程調度優先級的值。

ThreadState:獲取壹個包含當前線程狀態的值。

2.ThreadPool:提供壹個線程池,可用於發送工作項、處理異步I/O、代表其他線程等待以及處理計時器。

BindHandle:將操作系統句柄綁定到線程池。

GetAvailableThreads:檢索GetMaxThreads方法返回的最大線程池數與當前活動線程數之間的差值。

GetMaxThreads:檢索可以同時處於活動狀態的線程池請求的數量。所有大於該數量的請求將壹直排隊,直到線程池線程可用。

GetMinThreads:在新的請求預測中檢索由線程池維護的空閑線程的數量。

QueneUserWorkItem:將方法排隊等待執行。當線程池線程可用時,執行此方法。

RegisterWaitForSingleObject:註冊等待WaitHandle的委托。

UnsafeQueueUserWorkItem:註冊壹個正在等待WaitHandle的委托。

SetMaxThreads:為壹個線程池設置可以同時處於活動狀態的請求數。所有大於該數量的請求將壹直排隊,直到線程池線程可用。

四。示例及其解釋

使用系統;

使用系統。穿線;

公共階級工人

{

//線程啟動時會調用這個方法。

public void DoWork()

{

而(!_shouldStop) //如果線程正在運行,則打印信息。

{

控制臺。WriteLine("工作線程:正在工作...");

}

控制臺。WriteLine("工作線程:正常終止。");

}

公共void RequestStop()

{

_ shouldStop = true

}

//關鍵字volatile用來提醒編譯器這個數據成員將被多個線程訪問。

私有可變bool _ shouldStop//應該停止了。

}

公開課程

{

靜態空幹管()

{

//創建壹個線程對象。這不是線程的開始。

Worker Worker object = new Worker();

//在此定義壹個新線程。註意,這裏沒有使用ThreadStart委托。

//此外,構造函數接受對象的方法名。

Thread workerThread =新線程(workerObject。DoWork);

//這是線程的真正開始。

工人線程。start();

控制臺。WriteLine("主線程:工作線程啟動...");

//循環,直到線程被激活。thread的IsAlive屬性指示線程是否處於活動狀態。

而(!工人線程。isa live);

//暫停主線程1毫秒,以允許工作線程完成其工作。

線程。睡眠(1);

//需要工作線程自動停止。

工作對象。request stop();

//使用Join方法阻塞當前線程,直到對象的線程終止workerThread。join();

控制臺。WriteLine("主線程:工作線程已終止。");

}

}