Skip to main content
 首页 » 编程设计

c#之锁定main()线程

2024年01月22日27落叶无声

此处的术语不确定,但我基本上可以使用我的应用程序的main()线程来启动并调用两个线程,一个线程设置一个事件处理程序以等待特定的注册表项更改,而另一个启动计时器每5分钟左右将对xml文件所做的任何更改写入并连续运行。我的问题是,一旦调用的两个方法都初始化,它将返回到main并结束程序。我的相关代码部分可以在下面找到,所以任何帮助将不胜感激:

static void Main(string[] args) 
    { 
        runner one = new runner(); 
        runner two = new runner(); 
 
        Thread thread1 = new Thread(new ThreadStart(one.TimerMeth)); 
        Thread thread2 = new Thread(new ThreadStart(two.start)); 
 
        thread1.Start(); 
        thread2.Start(); 
 
        thread1.Join(); 
        thread2.Join(); 
    } 
 
public void TimerMeth() 
    { 
        System.Timers.Timer timer = new System.Timers.Timer(); 
 
        timer.Elapsed += new ElapsedEventHandler(OnElapsedTime); 
 
        timer.Interval = 300000; 
 
        timer.Enabled = true; 
    } 
 
    private void OnElapsedTime(object source, ElapsedEventArgs e) 
    { 
        file write = new file(); 
        write.write(RegKeys); 
    } 
 
public void start() 
        { 
            if (File.Exists("C:\\test.xml")) 
            { 
                file load = new file(); 
                RegKeys = load.read(RegKeys); 
            } 
 
            string hiveid = "HKEY_USERS"; 
            WindowsIdentity identity = WindowsIdentity.GetCurrent(); 
            string id = identity.User.ToString(); 
 
            string key1 = id + "\\\\Software\\\\Microsoft\\\\Windows NT\\\\CurrentVersion\\\\Windows Messaging Subsystem\\\\Profiles\\\\Outlook\\\\0a0d020000000000c000000000000046"; 
            List<string> value1 = new List<String> { "01020402", "test" }; 
 
            valuechange = new RegistryValueChange(hiveid, key1, value1); 
            valuechange.RegistryValueChanged += new EventHandler<RegistryValueChangedEventArgs>(valuechange_RegistryValueChanged); 
 
            try 
            { 
                valuechange.Start(); 
 
            } 
            catch 
            { 
                StreamWriter ut; 
                ut = File.AppendText("C:\\test.txt"); 
                ut.WriteLine("error occured in starting management"); 
                ut.Close(); 
            } 
 
            file test = new file(); 
            test.checkfile("C:\\test.xml"); 
 
        } 
 
void valuechange_RegistryValueChanged(object sender, RegistryValueChangedEventArgs e) 
        { 
// deals with the returned values 
} 

基本上所有代码都可以正常工作,我已经在Windows窗体应用程序中对其进行了测试,但是现在我需要在一个没有后台界面的独立应用程序中运行它,并且需要它继续写入xml文件和change事件,以便保留活。

请您参考如下方法:

您的方法将运行一次,然后线程将退出。没有什么可以让它们继续运行。

试试这个:

thread1.IsBackground = true; 
thread2.IsBackground = true; 
 
public void start() 
{ 
 while(true) 
 { 
    // ... do stuff 
    Thread.Sleep(1000*60*5) // sleep for 5 minutes 
 } 
} 
 
public void TimerMeth() 
{ 
    while(true) 
    { 
        file write = new file(); 
        write.write(RegKeys); 
 
        Thread.Sleep(30000); 
    } 
} 

正如其他张贴者所指出的那样,您还需要确保主方法不会退出。使应用程序成为Windows服务似乎是解决此问题的一种好方法。

您可能还想在线程上处理 ThreadInterruptedException和 ThreadAbortException。

如果您真的想深入了解线程的细节,请查看Joe Albahari的 Free C# Threading E-Book。