2017-08-11 53 views
0

我繼承發展責任一組,其中包括Windows服務的,一個ASP.NET網站,它們通過任務管理器推出標準的可執行文件.NET項目。確定有多個進程從同一個文本文件中讀取?

所有這些組件連接到MySQL數據庫。目前,加密的連接字符串位於各個app.config/web.config文件中。我認爲必須在多個地方更新連接字符串是一種痛苦,所以我的想法是將連接字符串放在一個文本文件中,所有單獨的組件都可以訪問它。

之前,我向前邁進充滿蒸汽的,我想請問如果我可能會引入錯誤,因爲有可能是多個進程試圖在同一時間訪問該文本文件。我寫了一個通用的方法對閱讀的文本文件,我很小心,以確保該文件是在「閱讀」模式被打開:

public string AESDecryptFromFile(string path, string password, string IV) 
    { 
     if (!File.Exists(path)) 
      throw new Exception("File not found: " + path); 

     string cryptogram; 
     using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read)) 
     { 
      using (StreamReader sr = new StreamReader(fs)) 
      { 
       cryptogram = sr.ReadToEnd().Trim(new char[] { '\r', '\n', ' ' }); 
      } 
     } 
     return AESDecrypt(cryptogram, password, IV); 
    } 

我沒有任何理由相信這些進程如果我以這種方式實現它,會鎖定文件,但我想我會問。

在此先感謝!

+0

你爲什麼不嘗試測試它? – mason

+0

https://stackoverflow.com/questions/3527205/multiple-threads-reading-from-the-same-file –

+0

@mason - 我的意思是說,我沒有在我的開發環境,有效地證明了這一點足夠的流量出。我想我可以寫一個產生多個線程的測試程序。 –

回答

2

默認情況下與(string path, FileMode mode, FileAccess access)構造的FileStream將得到下面的配置以及:

  • 文件共享= FileShare.Read
  • BUFFERSIZE = 4096
  • useAsync =假

由於您不希望進程鎖定文件,因此您將需要只讀(請參閱https://msdn.microsoft.com/en-us/library/system.io.fileshare(v=vs.110).aspx

不過,如果你想明確你可以使用下面的構造函數:

FileStream s = new FileStream(name, FileMode.Open, FileAccess.Read, FileShare.Read); 
+0

謝謝,這真的很有幫助! –

-1

直到你不改變文件還是可以的。它使問題時,你想要寫或寫和多線程讀取,因爲你不知道哪一個線程會寫/讀端/啓動第一,所以你不能預測任何行爲

-1

我想你可能需要告訴你的FileStream構造函數如何分享文件? "fileshare"