C# 如何在同一应用程序的两个实例之间实现线程?

C# 如何在同一应用程序的两个实例之间实现线程?,c#,multithreading,process,C#,Multithreading,Process,我有一个用C#开发的WinForm应用程序,它在我的本地驱动器中查找一个文件,如果找不到,则创建它,或者在文件中添加一些文本,然后读取它 如果我在同一台机器上从两个不同的文件夹运行我的应用程序的两个实例,我如何同步 我希望另一个实例在第一个实例处理文件时不要中断。请注意,由于两者都是同一应用程序的实例,因此它们在同一目标文件夹上工作以读写文件 是否需要实现任何线程技术?我认为最简单的解决方案是使用StreamReader和StreamWriter,并使用try-catch。如果一个实例已打开该文

我有一个用C#开发的WinForm应用程序,它在我的本地驱动器中查找一个文件,如果找不到,则创建它,或者在文件中添加一些文本,然后读取它

如果我在同一台机器上从两个不同的文件夹运行我的应用程序的两个实例,我如何同步

我希望另一个实例在第一个实例处理文件时不要中断。请注意,由于两者都是同一应用程序的实例,因此它们在同一目标文件夹上工作以读写文件


是否需要实现任何线程技术?

我认为最简单的解决方案是使用StreamReader和StreamWriter,并使用try-catch。如果一个实例已打开该文件,另一个实例将引发异常

  try
  {
    using (StreamWriter sw = new StreamWriter("my.txt", true))
    {
      sw.WriteLine(dir.Name);
    }
  }
  catch
  {
      //maybe retry in 5 seconds
  }

我认为最简单的解决方案是使用StreamReader和StreamWriter,并使用try-catch。如果一个实例已打开该文件,另一个实例将引发异常

  try
  {
    using (StreamWriter sw = new StreamWriter("my.txt", true))
    {
      sw.WriteLine(dir.Name);
    }
  }
  catch
  {
      //maybe retry in 5 seconds
  }

您可以使用命名的系统范围互斥体,但存在另一个进程可能正在使用该文件的问题(例如,用户)。文件系统就是您所需要的所有同步。像这样的事情应该对你有帮助:

static bool AddTextToFile( string someText , int maxAttempts )
{
    if ( string.IsNullOrWhiteSpace(someText) ) throw new ArgumentOutOfRangeException( "someText"    ) ;
    if ( maxAttempts < 0                     ) throw new ArgumentOutOfRangeException( "maxAttempts" ) ;

    bool success = false ;
    int  attempts = 0 ;

    while ( !success )
    {
        if ( maxAttempts > 0 && ++attempts > maxAttempts ) { break ; }
        try
        {
            using ( Stream       s = File.Open( @"c:\log\my-logfile.txt" , FileMode.Append , FileAccess.Write , FileShare.Read ) )
            using ( StreamWriter sw = new StreamWriter(s,Encoding.UTF8) )
            {
                sw.WriteLine("The time is {0}. The text is {1}" , DateTime.Now , someText );
                success = true ;
            }
        }
        catch (IOException)
        {
            // the file is locked or some other file system problem occurred
            // sleep for 1/4 second and retry
            success = false ;
            Thread.Sleep(250);
        }
    }

    return success ;
}
静态bool AddTextToFile(字符串someText,int-maxtures)
{
if(string.IsNullOrWhiteSpace(someText))抛出新ArgumentOutOfRangeException(“someText”);
如果(maxAttempts<0)抛出新ArgumentOutOfRangeException(“maxAttempts”);
布尔成功=假;
int=0;
而(!成功)
{
如果(maxAttempts>0&&++attempts>maxAttempts){break;}
尝试
{
使用(streams=File.Open(@“c:\log\my logfile.txt”、FileMode.Append、FileAccess.Write、FileShare.Read))
使用(StreamWriter sw=新StreamWriter(s,Encoding.UTF8))
{
WriteLine(“时间是{0},文本是{1}”,DateTime.Now,someText);
成功=真实;
}
}
捕获(IOException)
{
//文件已锁定或出现其他文件系统问题
//睡眠1/4秒,然后重试
成功=错误;
睡眠(250);
}
}
回归成功;
}

您可以使用一个命名的系统范围互斥体,但存在另一个进程可能正在使用该文件的问题(例如,用户)。文件系统就是您所需要的所有同步。像这样的事情应该对你有帮助:

static bool AddTextToFile( string someText , int maxAttempts )
{
    if ( string.IsNullOrWhiteSpace(someText) ) throw new ArgumentOutOfRangeException( "someText"    ) ;
    if ( maxAttempts < 0                     ) throw new ArgumentOutOfRangeException( "maxAttempts" ) ;

    bool success = false ;
    int  attempts = 0 ;

    while ( !success )
    {
        if ( maxAttempts > 0 && ++attempts > maxAttempts ) { break ; }
        try
        {
            using ( Stream       s = File.Open( @"c:\log\my-logfile.txt" , FileMode.Append , FileAccess.Write , FileShare.Read ) )
            using ( StreamWriter sw = new StreamWriter(s,Encoding.UTF8) )
            {
                sw.WriteLine("The time is {0}. The text is {1}" , DateTime.Now , someText );
                success = true ;
            }
        }
        catch (IOException)
        {
            // the file is locked or some other file system problem occurred
            // sleep for 1/4 second and retry
            success = false ;
            Thread.Sleep(250);
        }
    }

    return success ;
}
静态bool AddTextToFile(字符串someText,int-maxtures)
{
if(string.IsNullOrWhiteSpace(someText))抛出新ArgumentOutOfRangeException(“someText”);
如果(maxAttempts<0)抛出新ArgumentOutOfRangeException(“maxAttempts”);
布尔成功=假;
int=0;
而(!成功)
{
如果(maxAttempts>0&&++attempts>maxAttempts){break;}
尝试
{
使用(streams=File.Open(@“c:\log\my logfile.txt”、FileMode.Append、FileAccess.Write、FileShare.Read))
使用(StreamWriter sw=新StreamWriter(s,Encoding.UTF8))
{
WriteLine(“时间是{0},文本是{1}”,DateTime.Now,someText);
成功=真实;
}
}
捕获(IOException)
{
//文件已锁定或出现其他文件系统问题
//睡眠1/4秒,然后重试
成功=错误;
睡眠(250);
}
}
回归成功;
}

您可能需要查看。它们允许您执行跨进程锁定。当一个程序上的一个互斥锁打开时,另一个程序中的互斥锁将等待。

您可能需要查看。它们允许您执行跨进程锁定。当一个程序上的一个互斥锁打开时,另一个程序中的互斥锁将等待。

不需要同步原语。您应该能够以独占方式打开该文件。这将防止任何其他应用程序弄乱它。例如:

try
{
    using (var fs = new FileStream("foo", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None))
    {
        try
        {
            // do stuff with file.
        }
        catch (IOException ex)
        {
            // handle exceptions that occurred while working with file
        }
    }
}
catch (IOException openEx)
{
    // unable to open file
}

指定
FileShare.None
将阻止任何其他应用程序在您打开文件时访问该文件。

无需同步原语。您应该能够以独占方式打开该文件。这将防止任何其他应用程序弄乱它。例如:

try
{
    using (var fs = new FileStream("foo", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None))
    {
        try
        {
            // do stuff with file.
        }
        catch (IOException ex)
        {
            // handle exceptions that occurred while working with file
        }
    }
}
catch (IOException openEx)
{
    // unable to open file
}

指定
FileShare.None
将阻止任何其他应用程序在您打开文件时访问该文件。

我不确定,但您可能正在查看mutex。可能是一个相关的stackoverflow答案:你想要什么?在两个应用程序之间同步什么?从文件加载数据?变量?还是什么特别的?请解释一下“打开文件/写入数据/关闭,如果文件被锁定,请重试”这种最基本的方法有什么问题。别忘了将互斥锁设为全局互斥锁!你们听说过文件共享模式吗?这里不需要互斥体或其他同步原语。文件系统内置了处理这种常见情况的功能。我不确定,但您可能会看到mutex。可能是一个相关的stackoverflow答案:你想要什么?在两个应用程序之间同步什么?从文件加载数据?变量?还是什么特别的?请解释一下“打开文件/写入数据/关闭,如果文件被锁定,请重试”这种最基本的方法有什么问题。别忘了将互斥锁设为全局互斥锁!你们听说过文件共享模式吗?这里不需要互斥体或其他同步原语。文件系统具有处理这种常见情况的内置功能。