2015-10-21 15 views
0

我有.net Windows服務,它從文件夾獲取圖像文件列表並進行一些轉換並將轉換後的文件發送到另一個目錄。我想通過添加serVice的另一個實例來觀察相同的文件夾來獲得更多的吞吐量。我想要2個實例獨立處理文件,而無需重複處理。 可以使用哪些模式? 文件鎖定是否適用於此? 不想使用數據庫或任何其他消息傳遞平臺。 我可以使用文本文件等創建同步如果需要。Windows。服務多個實例處理來自同一個單一目錄重複的文件

+0

我們正在嘗試通過重複來實現高可用性...一個服務下其他可以繼續處理 – AlphaDeltaOmega

+0

是否可能發生?比如說,整個操作系統崩潰了嗎?您是否考慮過將服務配置爲自動重啓,或者讓看門狗服務根據需要重啓它? ...但是,是的,文件鎖定可能是你所需要的。 –

回答

1
  1. 如果使用.net,我會考慮創建多個線程(在.net中使用TPL),這將用於並行處理文件。通過這種方式,您可以擁有一個可以控制整個流程的流程。因此,不需要跟蹤什麼進程(exe)正在處理文件,沒有數據庫,沒有鎖定等。

  2. 但是,如果您希望有多個進程處理文件,則同步處理的一個選項是利用互斥體。

我會使用此選項以及解決方案1. I.e.在一個服務中使用TPL(多線程)。還使用互斥體。這樣你就有了多個線程和多個服務的好處。希望這是你所追求的。

https://msdn.microsoft.com/en-us/library/bwe34f1k(v=vs.110).aspx

處理任何文件之前,創建一個互斥與特定的名稱,如果所有權已被授予,然後繼續處理文件。如果沒有授予所有權,則可以安全地假定另一個進程或另一個線程(在同一個應用程序中)已獲得對此Mutex的鎖定,這意味着另一個進程/線程正在處理該文件。

示例代碼:

var fileMutex = new Mutex(true, "File Name", out mutexWasCreated); 
if (mutexWasCreated){ 
    //Some other process/thread is processing this file, so nothing to do 
} 
else { 
    //Start processing the file 
} 

如果一個服務(EXE)下降,那麼線程會死,這意味着將被釋放的互斥體和這些文件將可用於處理由另一個進程。

+0

我們也試圖通過重複來實現高可用性...一個服務停止其他可以繼續處理..... – AlphaDeltaOmega

相關問題