C# IO Reading and Writing file in use error
I have a library that handles reading and writing a cache file. This library is used by a Windows Service and several instances of a console application on the same machine. The console application runs when a user logs in.

I am getting occasional IO errors saying the cache file is in use by another process. I assume that collisions are occurring between the different application instances and service trying to read and write at the same time.

Is there a way to lock the file when it is in use and force all other requests to "wait in line" to access the file?

    	private void SaveCacheToDisk(WindowsUser user) {
			string serializedCache = SerializeCache(_cache);
			//encryt
			serializedCache = AES.Encrypt(serializedCache);

			string path = user == null ? ApplicationHelper.CacheDiskPath() :
				_registry.GetCachePath(user);
			string appdata = user == null ? ApplicationHelper.ClientApplicationDataFolder() :
				_registry.GetApplicationDataPath(user);

			if (Directory.Exists(appdata) == false) {
				Directory.CreateDirectory(appdata);
			}

			if (File.Exists(path) == false) {
				using (FileStream stream = File.Create(path)) { }
			}

			using (FileStream stream = File.Open(path, FileMode.Truncate)) {
				using (StreamWriter writer = new StreamWriter(stream)) {
					writer.Write(serializedCache);
				}
			}
		}

    	private string ReadCacheFromDisk(WindowsUser user) {
			//cache file path
			string path = user == null ? ApplicationHelper.CacheDiskPath() :
				_registry.GetCachePath(user);

			using (FileStream stream = File.Open(path, FileMode.Open)) {
				using (StreamReader reader = new StreamReader(stream)) {
					string serializedCache = reader.ReadToEnd();
					//decrypt
					serializedCache = AES.Decrypt(serializedCache);
					
					return serializedCache;
				}
			}
		}
C# IO Reading and Writing file in use error
===

I have a library that handles reading and writing a cache file. This library is used by a Windows Service and several instances of a console application on the same machine. The console application runs when a user logs in.

I am getting occasional IO errors saying the cache file is in use by another process. I assume that collisions are occurring between the different application instances and service trying to read and write at the same time.

Is there a way to lock the file when it is in use and force all other requests to "wait in line" to access the file?

    	private void SaveCacheToDisk(WindowsUser user) {
			string serializedCache = SerializeCache(_cache);
			//encryt
			serializedCache = AES.Encrypt(serializedCache);

			string path = user == null ? ApplicationHelper.CacheDiskPath() :
				_registry.GetCachePath(user);
			string appdata = user == null ? ApplicationHelper.ClientApplicationDataFolder() :
				_registry.GetApplicationDataPath(user);

			if (Directory.Exists(appdata) == false) {
				Directory.CreateDirectory(appdata);
			}

			if (File.Exists(path) == false) {
				using (FileStream stream = File.Create(path)) { }
			}

			using (FileStream stream = File.Open(path, FileMode.Truncate)) {
				using (StreamWriter writer = new StreamWriter(stream)) {
					writer.Write(serializedCache);
				}
			}
		}

    	private string ReadCacheFromDisk(WindowsUser user) {
			//cache file path
			string path = user == null ? ApplicationHelper.CacheDiskPath() :
				_registry.GetCachePath(user);

			using (FileStream stream = File.Open(path, FileMode.Open)) {
				using (StreamReader reader = new StreamReader(stream)) {
					string serializedCache = reader.ReadToEnd();
					//decrypt
					serializedCache = AES.Decrypt(serializedCache);
					
					return serializedCache;
				}
			}
		}