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

时间:2013-05-17 17:13:23

标签: c# multithreading process

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

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

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

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

4 个答案:

答案 0 :(得分:1)

不需要同步原语。您应该能够打开该文件以进行独占访问。这将阻止任何其他应用程序搞乱它。例如:

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会阻止任何其他应用程序在您打开文件时访问该文件。

答案 1 :(得分:0)

我认为最简单的解决方案是使用run catch包围的StreamReader和StreamWriter。如果一个实例打开了该文件,则另一个实例将抛出异常

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

答案 2 :(得分:0)

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

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 ;
}

答案 3 :(得分:0)

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