跳轉到內容

.NET 開發基礎/服務

來自 Wikibooks,開放世界的開放書籍


服務、執行緒和應用程式域


服務、執行緒和應用程式域

[編輯 | 編輯原始碼]

考試目標: 在 .NET Framework 應用程式中實現服務程序、執行緒和應用程式域

術語服務在此指 Windows 服務。Windows 服務的基本定義是無需使用者介面的長期執行程序。為什麼您需要一個無需使用者介面的長期執行程序?主要有兩個原因

  • 執行不需要使用者干預的維護任務。例如,備份軟體會定期檢查備份計劃,並在需要時執行不同的備份任務。這不需要使用者介面。
  • 響應來自其他程序或作業系統的請求。像 IIS(處理 Web 請求的 Windows 元件)這樣的 http 伺服器會接收來自客戶端瀏覽器的 http 請求並生成對這些瀏覽器的響應(html 頁面)。資料庫程序是另一個很好的例子。同樣,http 伺服器不需要使用者介面,因為與客戶端的互動是由客戶端瀏覽器元件管理的。

關於服務的考試目標非常基本,涉及到您在處理它們時遇到的第一個問題

  • 既然服務沒有使用者介面,那麼誰會啟動和停止它?答案是作業系統直接執行服務,但您必須 “註冊” 您的服務,讓系統知道它在哪裡以及如何處理它(這是安裝過程)
  • 具有使用者介面的程序基本上等待來自使用者的事件。在沒有訊息泵(在典型的線上應用程式中獲取使用者輸入的技術)的情況下,服務是如何“工作”的?
  • 如果服務執行使用者介面功能,它將 “掛起” 並等待一個不存在的使用者。如何避免這種情況?

更重要、更復雜的設計問題不會由本考試涵蓋,而會在企業開發考試中討論。

多執行緒

[編輯 | 編輯原始碼]


Clipboard

待辦事項
.NET 中多執行緒支援的描述


應用程式域

[編輯 | 編輯原始碼]


Clipboard

待辦事項
CLI 中應用程式域的簡短描述


類、介面和工具

[編輯 | 編輯原始碼]

實現、安裝和控制服務

[編輯 | 編輯原始碼]

考試目標: 實現、安裝和控制服務

(參考 System.ServiceProcess 名稱空間)

從 ServiceBase 類繼承 - MSDN

服務是一個長期執行的可執行檔案。它不提供使用者介面,也不需要任何使用者登入到計算機。服務以 System 身份執行,但可以選擇讓它們在不同的使用者帳戶下執行。ServiceBase 類是服務的基類。建立新服務時必須從它派生。
幾乎所有服務都會覆蓋 ServiceBase 的 OnStart 和 OnStop 方法。

ServiceController 類和 ServiceControllerPermission 類

ServiceController 類 - MSDN
ServiceControllerPermission 類 - MSDN

ServiceInstaller 和 ServiceProcessInstaller 類

ServiceInstaller - MSDN
ServiceProcessInstaller 類 - MSDN

ServiceChangeDescription 結構和 ServiceChangeReason 列舉

SessionChangeDescription 結構 - MSDN
SessionChangeReason 列舉 - MSDN

開發多執行緒應用程式

[編輯 | 編輯原始碼]

考試目標: 開發多執行緒 .NET Framework 應用程式

(參考 System.Threading 名稱空間)

Thread 類 - MSDN

ThreadPool 類 - MSDN

ThreadStart 委託、ParameterizedThreadStart 委託和 SynchronizationContext 類

ThreadStart 委託 - MSDN
建立執行緒的最簡單方法是例項化 Thread 類。Thread 建構函式接受一個委託引數。ThreadStart 委託指向包含您的邏輯的方法。例如
Thread t1 = new Thread (new ThreadStart(LengthyLogic));
public void LengthyLogic ()
{
  // Logic code
}
ParameterizedThreadStart 委託 - MSDN
啟動執行緒時,有時您需要傳入一些要處理的資料。.NET 2.0 提供了一個新的委託 ParameterizedThreadStart,它接受一個 object 型別的引數。該類有一個新的過載函式 Thread.Start。它允許您指定要傳遞到執行緒的值。這種方法很簡單,但不是型別安全的。示例
Thread t1 = new Thread(new ParameterizedThreadStart(LengthyLogic));
// Use the overload of the Start method that has a parameter of type Object.
t1.Start(myData);
static void LengthyLogic(object data)
{
  // Logic code
}
SynchronizationContext 類 - MSDN
Code Project 中 SynchronizationContext 類的示例 [1]

Timeout 類、Timer 類、TimerCallback 委託、WaitCallback 委託、WaitHandle 類和 WaitOrTimerCallback 委託

Timeout 類 - MSDN
Timer 類 - MSDN
TimerCallback 委託 - MSDN
WaitCallback 委託 - MSDN
WaitHandle 類 - MSDN
WaitOrTimerCallback 委託 - MSDN

ThreadExceptionEventArgs 類和 ThreadExceptionEventHanlder 類

ThreadExceptionEventArgs 類 - MSDN
ThreadExceptionEventHandler 類 - MSDN

ThreadState 列舉和 ThreadPriority 列舉

ThreadState 列舉 - MSDN
ThreadPriority 列舉 - MSDN

ReaderWriterLock 類 - MSDN

AutoResetEvent 類和 ManualResetEvent 類

AutoResetEvent 類 - MSDN
ManualResetEvent 類 - MSDN

IAsyncResult 介面和 ICancelableAsyncResult 介面

(參考 System 名稱空間)
IAsyncResult 介面 - MSDN
ICancelableAsyncResult 介面 - MSDN

EventWaitHandle 類、RegisterWaitHandle 類、SendOrPostCallback 委託和 IOCompletionCallback 委託

EventWaitHandle 類 - MSDN
RegisterWaitHandle 類 - MSDN
這是考試目標和培訓教材中的一個筆誤。術語 **RegisterWaitForSingleObject** 應改為 saerch(參見 KB
SendOrPostCallback 委託 - MSDN
IOCompletionCallback 委託 - MSDN

Interlocked 類、NativeOverlapped 結構和 Overlapped 類

Interlocked 類 - MSDN
NativeOverlapped 結構 - MSDN
Overlapped 類 - MSDN

ExecutionContext 類、HostExecutionContext 類、HostExecutionContext 管理器和 ContextCallback 委託

ExecutionContext 類 - MSDN
HostExecutionContext 類 - MSDN
HostExecutionContext 管理器 - MSDN
實際上這裡指的是 HostExecutionContextManager 類
ContextCallback 委託 - MSDN

LockCookie 結構、Monitor 類、Mutex 類和 Semaphore 類 MSDN]

LockCookie 結構 - MSDN
Monitor 類 - MSDN
Mutex 類 - MSDN
Semaphore 類 - MSDN
鎖 vs Monitor vs Mutex - MSDN

使用應用程式域

[edit | edit source]

考試目標:使用應用程式域,在 .NET Framework 應用程式中建立通用語言執行時的隔離單元

(參考 System 名稱空間)

建立應用程式域
[edit | edit source]

參見 MSDN

應用程式域是將一個程序劃分為多個部分。在不同應用程式域中執行的應用程式與在不同程序中執行的應用程式一樣隔離。因此它們無法訪問另一個應用程式域中的記憶體。但是,如果執行的是本機程式碼,它可以無限地訪問整個程序,包括其他應用程式域。

應用程式域更容易維護,速度也更快,因為在應用程式域之間通訊比在程序之間通訊更容易。一個應用程式域可以包含多個程式集。

要建立應用程式域,您至少需要提供新應用程式域的名稱

 AppDomain ad = AppDomain.CreateDomain("Name");

使用 AppDomain.CurrentDomain 獲取呼叫執行緒正在使用的應用程式域。

將程式集載入到應用程式域
[edit | edit source]

參見 MSDN

可以使用 AppDomain.ExecuteAssemblyByName 按名稱執行程式集

 AppDomain ad = AppDomain.CreateDomain("Name");
 ad.ExecuteAssemblyByName("aname, Version=1.0.0.0, Culture=neutral, PublicKeyToken=a9b8c7d6");

或者使用 AppDomain.ExecuteAssembly 提供程式集的路徑

 AppDomain ad = AppDomain.CreateDomain("Name");
 ad.ExecuteAssembly(@"c:\path\to\file.exe");
解除安裝應用程式域
[edit | edit source]

參見 MSDN

無法從預設應用程式域解除安裝程式集。但是,如果在不同的應用程式域中載入程式集,則可以解除安裝整個應用程式域,其中包括該應用程式域中的所有程式集。

要解除安裝應用程式域,請使用靜態 AppDomain.Unload 函式

 AppDomain ad = AppDomain.CreateDomain("Name");
 AppDomain.Unload(ad);  
配置應用程式域
[edit | edit source]

參見 MSDN

修改應用程式域配置的最可能原因是限制某些許可權,以限制攻擊者利用程式集中的漏洞造成的損害。

例如,在 Internet Zone 中執行程式集。Internet Zone 具有有限的許可權。要做到這一點,請建立一個 Zone Evidence 並將其作為引數提供給建立應用程式域時。

 object [] myEvidenceTypes = {new Zone (SecurityZone.Internet)};
 Evidence myEvidence = new  Evidence(myEvidenceTypes, null);
 AppDomain ad = AppDomain.CreateDomain("Name", myEvidence); // Pass the Evidence when creating the App. Domain
 ad.ExecuteAssembly(@"c:\path\to\file.exe");
 

還可以使用不同的許可權在一個應用程式域中僅執行一個程式集;

 object [] myEvidenceTypes = {new Zone (SecurityZone.Internet)};
 Evidence myEvidence = new  Evidence(myEvidenceTypes, null);
 AppDomain ad = AppDomain.CreateDomain("Name");
 ad.ExecuteAssembly(@"c:\path\to\file.exe", myEvidence); // Pass the Evidence in the ExecuteAssembly function

除了 Evidence 之外,還可以使用 AppDomainSetup 類來設定其他屬性。

 AppDomainSetup ads = new AppDomainSetup();
 ads.ApplicationBase = @"c:\Test";
 ads.DisallowCodeDownload = true;
 AppDomain ad = AppDomain.CreateDomain("Name", null, ads); // use null as second parameter for default Evidence
從應用程式域檢索設定資訊
[edit | edit source]

參見 MSDN

使用 AppDomain 的 SetupInformation 屬性來讀取該應用程式域中的設定;

 AppDomainSetup ads = AppDomain.CurrentDomain.SetupInformation;
 Console.WriteLine(ads.ConfigurationFile);
 Console.WriteLine(ads.ApplicationName);


上頁 / 下頁

華夏公益教科書