在多线程程序C#

时间:2017-03-31 10:52:11

标签: c# multithreading

  • 我有一个多线程程序(3-4个线程)。所有线程都依赖于XML文件中指定的几个参数。

  • 由于XML文件中的参数可能会被用户随时更改,因此需要通知不同的线程,并需要获取更新的参数副本。

  • 要监控XML文件中的更改,我根据MSDN文档使用FileWatcher

    clas  ReadXML
    {
    //parameters
    private static string Param1 = "";
    private static string Param2 = "";
    
    
    public static void ReadXmlParameters()
    {
        XmlDocument xDoc = new XmlDocument();
        try
        {
            xDoc.Load(_ParameterFileDirrectory + @"\" + _ParameterFileDirrectory);
    
            //parameters
            Param1 = (xDoc.DocumentElement.SelectSingleNode("/Parameters/SetOne/IpAddress")).InnerText;
            Param2 = (xDoc.DocumentElement.SelectSingleNode("/Parameters/SetOne/Username")).InnerText;                
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        } 
    }
    
    
    public static void CreateXMLWatcher()
    {
        try
        {
            // Create a new FileSystemWatcher and set its properties.
            FileSystemWatcher watcher = new FileSystemWatcher();
            watcher.Path = _ParameterFileDirrectory;
            /* Watch for changes in LastAccess and LastWrite times, and 
               the renaming of files or directories. */
            watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
               | NotifyFilters.FileName | NotifyFilters.DirectoryName;
            // Only watch .xml files.
            watcher.Filter = _ParameterFileFilename; // "ParameterFile.xml";
    
            // Add event handlers.
            watcher.Changed += new FileSystemEventHandler(OnChanged);
            watcher.Created += new FileSystemEventHandler(OnChanged);
            watcher.Deleted += new FileSystemEventHandler(OnChanged);
            watcher.Renamed += new RenamedEventHandler(OnRenamed);
    
            // Begin watching.
            watcher.EnableRaisingEvents = true;
        }
        catch(Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }
    
    // Define the event handlers.
    private static void OnChanged(object source, FileSystemEventArgs e)
    {
        // Specify what is done when a file is "Changed", "Created", or "Deleted".
        Console.WriteLine("File: " + e.FullPath + " " + e.ChangeType);
    
        if (e.ChangeType.ToString() == "Changed")
        {
            ReadXmlParameters(); //Read the Parameters from XML again
    
            MyThreadClass1._waitTillParametersChange.Set(); //Notifying the thread that the parameters might have chnaged
    
        }
    
    }
    
    }
    

    上述实施对我来说很好。我必须使用以下行从Main()启动FileWatcher:

    public static void Main()
    {
        ReadXml.ReadXmlParameters();        
        ReadXml.CreateXMLWatcher();
    
        // Start other threads now
    }
    

然后我开始我的其他线程。

问题:由于上面提到的实现,我的程序中有静态方法和变量,所以我想知道这是否是{{{{或者我应该尝试通过将FileWatcher实现为单例类(或者为所有线程类提供相同的对象)来摆脱这些静态事物。

0 个答案:

没有答案