Possible en double:
Locking main() threadGarder un fil vivant dans une application C#
Ci-dessous vous trouverez mon code, principal appelle deux fils, l'un initie un gestionnaire d'événements qui renvoie les valeurs de clés de registre après avoir été modifiées. L'autre met en place une minuterie qui écrit les modifications dans un fichier XML toutes les quelques minutes. Fondamentalement, je cherche à exécuter l'écriture encore et encore pendant que je souhaite que le lancement du gestionnaire d'événements ne s'exécute qu'une seule fois, mais reste ouvert pour accepter les événements. Est-ce qu'il y a un moyen de faire ça? Des gestionnaires d'attente qui permettront toujours au code de fonctionner, etc.? S'il vous plaît noter qu'il s'agit d'une application en arrière-plan, sans console car je ne veux pas d'interaction de l'utilisateur avec le système (je sais qu'un service est la solution, mais quand j'ai posé des questions similaires une application et une application ont plus de sens pour la façon dont je veux l'exécuter/l'utiliser.)
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);
}
}
}
Avez-vous déjà demandé et accepté une réponse à cette même question? http://stackoverflow.com/questions/1722932/locking-main-thread –
LOL! Et j'étais occupé à composer une jolie réponse ... disant principalement la même chose que la réponse précédente ... –