CWorkerThreadAssembly 透過 IWebMessage 介面與外部組件解耦:
public interface IWebMessage {
WebMessageReturn Process(string messageLabel, string messageBody, int appSpecific);
void Release();
}
public enum WebMessageReturn { ReturnGood, ReturnBad, ReturnAbort }
ReturnGood:繼續處理下一條訊息。ReturnBad:將訊息寫入錯誤佇列,不終止服務。ReturnAbort:終止處理執行緒。Release() 提供確定性資源釋放機制,補足 .NET 非確定性終結子的不足,確保昂貴資源(資料庫連線等)及時釋放。
MSDNMessageService.Service:服務核心代碼,跨多檔案共享命名空間,免 using 互引。MSDNMessageService.Interface:含 IWebMessage,使用者需引用。繼承 ServiceBase,實作 Windows 服務四大命令:
public class ServiceControl : ServiceBase {
public static void Main() { ServiceBase.Run(new ServiceControl()); }
public ServiceControl() {
CanPauseAndContinue = true;
ServiceName = "MSDNMessageService";
AutoLog = false;
}
protected override void OnStart(string[] args) { /* 建立 CWorker */ }
protected override void OnStop() { /* 停止所有 Worker */ }
protected override void OnPause() { /* 暫停所有 Worker */ }
protected override void OnContinue() { /* 繼續所有 Worker */ }
}
檔名同 .exe 但副檔名 .config:
<?xml version="1.0"?>
<configuration>
<ProcessList>
<ProcessDefinition ProcessName="Worker1" ProcessDesc="Message Worker with 2 Threads"
ProcessType="AppSpecific" ProcessThreads="2"
InputQueue=".\private$\test_load1" ErrorQueue=".\private$\test_error">
<OutputList>
<OutputDefinition OutputName=".\private$\test_out11"/>
<OutputDefinition OutputName=".\private$\test_out12"/>
</OutputList>
</ProcessDefinition>
<ProcessDefinition ProcessName="Worker2" ProcessDesc="Assembly Worker with 1 Thread"
ProcessType="Assembly" ProcessThreads="1"
InputQueue=".\private$\test_load2" ErrorQueue=".\private$\test_error">
<OutputList>
<OutputDefinition OutputName="C:\MSDNMessageService\MessageExample.dll"/>
<OutputDefinition OutputName="MSDNMessageService.MessageSample.ExampleClass"/>
</OutputList>
</ProcessDefinition>
</ProcessList>
</configuration>
兩種處理器範例:AppSpecific 循環轉發至多佇列;Assembly 載入外部組件處理。