下面你會發現我的代碼,主要調用兩個線程,一個啓動的事件處理程序返回的值它們被更改後的註冊表項。另一個設置計時器,每隔幾分鐘將更改寫入一個XML文件。基本上,我希望一遍又一遍地運行寫操作,但希望啓動事件處理程序只運行一次,但仍然可以接受事件。有沒有辦法做到這一點?任何等待處理程序仍然允許代碼運行等?請注意,這是一個後臺應用程序,沒有控制檯,因爲我不希望任何用戶與系統進行交互(我通常知道服務是要走的路,但是當我在運行服務時詢問類似問題時,我被告知要做應用程序和應用程序對於我如何運行/使用它更有意義。)
public class 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();
}
}
public class runner
{
RegistryValueChange valuechange;
List<regkey> RegKeys = new List<regkey>();
static object locker = new object();
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);
file test = new file();
test.checkfile("C:\\test.xml");
}
void valuechange_RegistryValueChanged(object sender, RegistryValueChangedEventArgs e)
{
}
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)
{
lock (locker)
{
file write = new file();
write.write(RegKeys);
}
}
}
您是否已經問過並接受同一個問題的答案? http://stackoverflow.com/questions/1722932/locking-main-thread – 2009-11-20 09:29:49
LOL!我正在忙着寫一個漂亮的答案......主要是說以前的答案是一樣的...... – 2009-11-20 09:31:42