Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当应用程序的多个实例同时使用StreamWriter访问同一文件时会发生什么情况?_C#_.net_File_Authentication_Streamwriter - Fatal编程技术网

C# 当应用程序的多个实例同时使用StreamWriter访问同一文件时会发生什么情况?

C# 当应用程序的多个实例同时使用StreamWriter访问同一文件时会发生什么情况?,c#,.net,file,authentication,streamwriter,C#,.net,File,Authentication,Streamwriter,我有一个可以同时被多个用户使用的应用程序。应用程序使用API,其令牌需要不时刷新。令牌保存在一个文件中。当需要刷新令牌时,文件将被新令牌覆盖。我担心的是,在极少数情况下,应用程序的两个实例可能会试图同时写入文件。然后呢?我希望避免出现一种情况,即留下一个空文件 我读过其他相关问题,看过“操作系统会安排它们”和“任何事情都可能发生”。是哪一个 如果有帮助的话,这里有5行问题。此外,目前这并不是在一个单独的线程上发生的 string newTokens = GetTokens(); using (S

我有一个可以同时被多个用户使用的应用程序。应用程序使用API,其令牌需要不时刷新。令牌保存在一个文件中。当需要刷新令牌时,文件将被新令牌覆盖。我担心的是,在极少数情况下,应用程序的两个实例可能会试图同时写入文件。然后呢?我希望避免出现一种情况,即留下一个空文件

我读过其他相关问题,看过“操作系统会安排它们”和“任何事情都可能发生”。是哪一个

如果有帮助的话,这里有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();
}

您只需要有一个关键部分,确保一次只有一个应用程序实例访问该文件。您可以通过使用互斥来实现这一点,因为可以将互斥定义为机器范围的,因此可以在不同进程之间共享


启动时,应用程序将创建/打开互斥锁。然后,当需要访问文件时,等待捕获互斥体,执行文件工作,然后释放互斥体。如果应用程序崩溃,操作系统会自动释放互斥锁。因此,它很好、安全且易于使用。

您无法控制这种情况,因此,请将代码块放入try-catch中,并在写入失败时对异常作出反应。我会为此使用数据库,这样可以更好地防止覆盖。您当前的代码当然可以覆盖其他用户所做的更改。或者,
FileShare.Read
甚至
FileShare.None
可能更可取,如果在关闭文件之前只允许一个实例具有独占写访问权。其他的会失败,所以你需要试着抓住它们。(例如,当同时运行的多个实例接收到完全相同的令牌时,其中至少有一个实例需要将其保存在一个文件中,而不会影响其他实例)。用例不是100%清楚的。是的,我同意,只是适当地处理IOExceptions