当一个应用程序的多个实例同时使用 StreamWriter 访问同一个文件时会发生什么?
What happens when multiple instances of an application access the same file with StreamWriter at the exact same time?
我有一个可以同时供多个用户使用的应用程序。该应用程序使用 API 并且其令牌需要不时刷新。令牌保存在文件中。当需要刷新令牌时,文件将被新令牌覆盖。我担心的是,在极少数情况下,应用程序的两个实例可能会同时尝试写入文件。那么会发生什么?我想避免留下空文件的情况。
我已经阅读了其他相关问题并且我看到了 "the OS will schedule them" 和 "anything can happen"。是哪一个?
如果有帮助,这里是有问题的 5 行。此外,这目前不会在单独的线程上发生。
string newTokens = GetTokens();
using (StreamWriter writer = new StreamWriter("TokensFile.txt")) {
writer.Write(newTokens));
writer.Flush();
writer.Close();
}
该文件将包含最后一位写入者写入的内容。给作者 FileShare.ReadWrite
将允许多个作者使用它:
string newTokens = GetTokens();
using (StreamWriter writer = new StreamWriter("TokensFile.txt", FileMode.Create, FileAccess.Write, FileShare.Readwrite)) {
writer.Write(newTokens));
writer.Flush();
writer.Close();
}
您只需要有一个关键部分,以确保一次只有一个应用程序实例访问该文件。您可以通过使用 Mutex 来做到这一点,因为它们可以定义为机器范围内的,因此可以在不同进程之间共享。
启动您的应用程序时将 create/open 互斥锁。然后,当您需要访问文件时,您等待捕获互斥体,完成文件工作,然后释放互斥体。如果您的应用程序崩溃,操作系统会自动释放互斥量。所以它既美观又安全又易于使用。
我有一个可以同时供多个用户使用的应用程序。该应用程序使用 API 并且其令牌需要不时刷新。令牌保存在文件中。当需要刷新令牌时,文件将被新令牌覆盖。我担心的是,在极少数情况下,应用程序的两个实例可能会同时尝试写入文件。那么会发生什么?我想避免留下空文件的情况。
我已经阅读了其他相关问题并且我看到了 "the OS will schedule them" 和 "anything can happen"。是哪一个?
如果有帮助,这里是有问题的 5 行。此外,这目前不会在单独的线程上发生。
string newTokens = GetTokens();
using (StreamWriter writer = new StreamWriter("TokensFile.txt")) {
writer.Write(newTokens));
writer.Flush();
writer.Close();
}
该文件将包含最后一位写入者写入的内容。给作者 FileShare.ReadWrite
将允许多个作者使用它:
string newTokens = GetTokens();
using (StreamWriter writer = new StreamWriter("TokensFile.txt", FileMode.Create, FileAccess.Write, FileShare.Readwrite)) {
writer.Write(newTokens));
writer.Flush();
writer.Close();
}
您只需要有一个关键部分,以确保一次只有一个应用程序实例访问该文件。您可以通过使用 Mutex 来做到这一点,因为它们可以定义为机器范围内的,因此可以在不同进程之间共享。
启动您的应用程序时将 create/open 互斥锁。然后,当您需要访问文件时,您等待捕获互斥体,完成文件工作,然后释放互斥体。如果您的应用程序崩溃,操作系统会自动释放互斥量。所以它既美观又安全又易于使用。