Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[C#] Service wacht met starten totdat opdracht klaar is.

Pagina: 1
Acties:

  • Kryziek
  • Registratie: Juni 2010
  • Laatst online: 11:21

Kryziek

bb || !bb

Topicstarter
Hallo,

mijn eigen gemaakt service wacht met starten totdat hij een php script uitgevoerd heeft.
In het php script staat nu als test een loopje die elke seconde een string echo't. Ik heb een gui gemaakt met een knop om de service te starten en die wacht totdat de service de status gestart heeft totdat hij verder gaat. Maar omdat het 10 seconden duurt voordat het php script klaar is duurt het ook 10 seconden voordat mij gui verder gaat.
Ik controleer dat met:
ServiceController Service = new ServiceController("MijnService");
Service.WaitForStatus(ServiceControllerStatus.Running);


Wat ik dus wil is dat het php script pas uitgevoerd wordt als de service klaar is met starten. Want uiteindelijk gaat er een php script uitgevoerd worden die een paar minuten bezig is en daar kun je niet op wachten.

Weet iemand hoe ik verder moet?
Op google heb ik wel gezocht maar ik weet niet precies in welke richting ik moet zoeken.

*snip* Externe code zien we liever niet

[ Voor 5% gewijzigd door Woy op 23-10-2012 16:07 ]


  • Alex)
  • Registratie: Juni 2003
  • Laatst online: 18-11 20:57
Hetgeen je zoekt heet "asynchroon", wat je hierbij eventueel kan helpen is de BackgroundWorker.

We are shaping the future


  • Haan
  • Registratie: Februari 2004
  • Laatst online: 10:27

Haan

dotnetter

Alex) schreef op dinsdag 23 oktober 2012 @ 15:33:
Hetgeen je zoekt heet "asynchroon", wat je hierbij eventueel kan helpen is de BackgroundWorker.
Als .NET 4.0 een optie is, is het gebruik van Tasks wellicht een mooiere, modernere oplossingsmogelijkheid :)

Kater? Eerst water, de rest komt later


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Ik heb je externe linkjes verwijderd. We zien liever geen externe lappen met code. Als je iets wil illustreren met een code voorbeeld zien we die graag in de code zodat die later ook nog beschikbaar is als iemand dit topic leest.

Verder willen we dat je alleen relevante stukjes code plaatst. Dat is makkelijk voor mensen om te lezen, en dwingt ook jou om je probleem op een kleiner stuk te isoleren.

Ontopic:
Leg eens precies uit welke processen je allemaal hebt, en welk proces er nou precies waar op moet wachten want het is mij niet helemaal duidelijk
Kryziek schreef op dinsdag 23 oktober 2012 @ 15:32:
mijn eigen gemaakt service wacht met starten totdat hij een php script uitgevoerd heeft.
Start de service het PHP script op? Dan is de service toch al gestart op dat moment?

Hoe start je dat PHP script op? Als dat via de Process class is heb je gewoon de WaitForExit methode die wacht tot een process klaar is.

[ Voor 41% gewijzigd door Woy op 23-10-2012 16:11 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Kryziek
  • Registratie: Juni 2010
  • Laatst online: 11:21

Kryziek

bb || !bb

Topicstarter
Ik heb dus een form met een knop erin die mijn eigen gemaakt service start. Als mijn service start gaat hij een PHP script uitvoeren die een bepaalde tijd nodig heeft.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
protected override void OnStart(string[] args)
        {
            base.OnStart(args);
            try
            {
                Process process = new Process();
                process.StartInfo.UseShellExecute = false;
                process.StartInfo.RedirectStandardOutput = true;
                process.StartInfo.RedirectStandardError = true;
                process.StartInfo.CreateNoWindow = true;
                process.StartInfo.FileName = @"C:\xampp\php\php.exe";
                process.StartInfo.Arguments = @"C:\xampp\htdocs\Service\Test.php";
                process.Start();

Maar mijn form wacht tot de service helemaal gestart is om een melding te geven dat hij succesvol gestart is.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
private void toolStripButtonStart_Click_1(object sender, EventArgs e)
        {
            listBox1.Items.Add("Service wordt gestart...");
            toolStripStatusLabel1.Text = "Service wordt gestart...";
            try
            {
                Service.Start();
                Service.WaitForStatus(ServiceControllerStatus.Running);
                listBox1.Items.Add("Service succesvol gestart!");
                toolStripStatusLabel1.Text = "Service is succesvol gestart!";
            }
            catch
            {
                listBox1.Items.Add("Starten service mislukt!");
                toolStripStatusLabel1.Text = "Starten service mislukt!";
            }
        }

Maar het duurt in dit geval 10 seconden voordat het PHP script klaar is. Daarom duurt het ook 10 seconden voordat mijn form verder kan en dus de melding geven dat het gelukt is. Hij wacht dus op WaitForStatus. Het lijkt dus alsof mijn form vastgelopen is.

Ik wil graag dat hij daar niet op hoeft te wachten. Dus de service moet starten en als hij gestart is pas het PHP script gaan uitvoeren.

Volgens mij wacht de service met het geven van de status 'Started' totdat hij het PHP script heeft uitgevoerd.

  • Hydra
  • Registratie: September 2000
  • Laatst online: 06-10 13:59
En Alex heeft al aangegeven waar je op moet zoeken.

https://niels.nu


  • Alex)
  • Registratie: Juni 2003
  • Laatst online: 18-11 20:57
De code die je hebt opgegeven in de OnStart-methode van je service wordt uitgevoerd tijdens het starten. De ServiceController beschouwt de service als startende zolang de methode OnStart wordt uitgevoerd.

We are shaping the future


  • Kryziek
  • Registratie: Juni 2010
  • Laatst online: 11:21

Kryziek

bb || !bb

Topicstarter
Dat is dus precies wat ik bedoelde. :D Alleen niet zo mooi verwoord.
Maar waar zou ik het dan neer moeten zetten?

Btw. Met die async, backgroundworker, tasks.. Ik kom er maar niet uit. Ik krijg er niets werkend uit.

  • Alex)
  • Registratie: Juni 2003
  • Laatst online: 18-11 20:57
Wat je zou kunnen doen is de code die je nu in je OnStart-methode hebt staan verplaatsen naar een losse methode. Vervolgens kun je d.m.v. Task.Factory.StartNew of ThreadPool.QueueUserWorkItem (afhankelijk van je .NET-versie) relatief makkelijk de boel asynchroon maken. Op MSDN is voldoende documentatie te vinden.

We are shaping the future


  • Hydra
  • Registratie: September 2000
  • Laatst online: 06-10 13:59
Oftewel: "Willen jullie het ff voorkauwen want via google uitzoeken wat je bedoelt is me teveel werk".

https://niels.nu


  • Kryziek
  • Registratie: Juni 2010
  • Laatst online: 11:21

Kryziek

bb || !bb

Topicstarter
Het komt wel zo over, ik geef je daar gelijk in, maar ik ben er een hele dag mee aan het knooien geweest en het wou me niet lukken. Vandaag weer een halve dag zonder resultaat dus besloot ik hier maar een topic te openen. :P
Ik heb geprobeerd de process.start(); in een Task.Factory.StartNew te zetten maar dan springt hij meteen naar de catch toe.
Het klopt dat er op msdn genoeg te vinden is, maar in de meeste gevallen begrijp ik het niet of is het te ingewikkeld.

Als jullie mij in een richting kunnen duwen dan was het al genoeg geweest en dat hebben jullie ook zeker gedaan. Maar helaas kom ik er nog niet uit. Ik hoop dat jullie mij hier nog verder in kunnen/willen helpen.

  • Alex)
  • Registratie: Juni 2003
  • Laatst online: 18-11 20:57
Als je alleen de call naar process.Start in de TaskFactory zet zal het niet werken. De Task wordt in een andere thread uitgevoerd waardoor de code niet meer bij het Process-object kan.

Wat je zult moeten doen is het hele statement, vanaf Try... tot en met de afsluitende accolade van het catch-statement, in een aparte methode zetten, en vervolgens Task.Factory.StartNew aanroepen met als parameter die methode.

We are shaping the future


  • analog_
  • Registratie: Januari 2004
  • Niet online

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 10:27

Haan

dotnetter

Ik denk niet dat de TS erg geholpen is met de documentatie van Silverlight..

Kater? Eerst water, de rest komt later


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Haan schreef op woensdag 24 oktober 2012 @ 08:21:
[...]

Ik denk niet dat de TS erg geholpen is met de documentatie van Silverlight..
De BackgroundWorker zit ook gewoon in het Full/Client .NET framework, dus hoewel de documentatie inderdaad in het Silverlight gedeelte staat is het wel degelijk relevant.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Haan
  • Registratie: Februari 2004
  • Laatst online: 10:27

Haan

dotnetter

Woy schreef op woensdag 24 oktober 2012 @ 08:24:
[...]

De BackgroundWorker zit ook gewoon in het Full/Client .NET framework, dus hoewel de documentatie inderdaad in het Silverlight gedeelte staat is het wel degelijk relevant.
Maar die is in de eerste post al genoemd, dus als je dan toch alleen een link neerplempt, zorg dan dat het in ieder geval de goede is.. nog los van dat je imo beter Tasks kunt gebruiken

Kater? Eerst water, de rest komt later


  • Kryziek
  • Registratie: Juni 2010
  • Laatst online: 11:21

Kryziek

bb || !bb

Topicstarter
Alex) schreef op dinsdag 23 oktober 2012 @ 19:16:
Als je alleen de call naar process.Start in de TaskFactory zet zal het niet werken. De Task wordt in een andere thread uitgevoerd waardoor de code niet meer bij het Process-object kan.

Wat je zult moeten doen is het hele statement, vanaf Try... tot en met de afsluitende accolade van het catch-statement, in een aparte methode zetten, en vervolgens Task.Factory.StartNew aanroepen met als parameter die methode.
Nice! Nu werkt het!

Maar is het wel de bedoeling dat ik alles in de OnStart doe?

  • sig69
  • Registratie: Mei 2002
  • Laatst online: 10:56
Dat is aan jou om te bepalen. Persoonlijk denk ik van niet, je wil immers op bepaalde tijden een andere processen starten, er zal dus iets moeten gaan draaien die dat doet (een thread, een timer, whatever).

Roomba E5 te koop


  • Kryziek
  • Registratie: Juni 2010
  • Laatst online: 11:21

Kryziek

bb || !bb

Topicstarter
Ja precies, maar waar moet ik het dan uitvoeren? Ik heb op google wel gezocht maar ik weet niet precies waar ik op moet zoeken.. :$

  • Alex)
  • Registratie: Juni 2003
  • Laatst online: 18-11 20:57
Wat mij niet helemaal duidelijk is, is waarom je een service gebruikt om vervolgens weer een PHP-script uit te voeren.

In een service die ik zelf heb geschreven gebruik ik de OnStart om een timer te initaliseren, bij iedere tick van die timer (ieder kwartier) wordt dan een stuk code uitgevoerd. Zo kan het proces uitgevoerd blijven worden zonder dat er iemand op de machine aangemeld hoeft te zijn. De service draait op een headless server, wel zo handig dus. :)

[ Voor 59% gewijzigd door Alex) op 24-10-2012 10:18 ]

We are shaping the future


  • Kryziek
  • Registratie: Juni 2010
  • Laatst online: 11:21

Kryziek

bb || !bb

Topicstarter
Omdat het start als de server ook start zonder dat er een gebruiker ingelogd hoeft te zijn.
Ze laten nu door een Scheduled Task een batch starten die weer het php script uitvoert en die tovert altijd een browser venster bij een ingelogde gebruiker. Die gebruikers kennen het venster niet en sluiten het dus af waardoor het PHP script ook afgekapt wordt. Een service wordt op de achtergrond uitgevoerd waardoor de gebruiker het niet ziet.

  • Hydra
  • Registratie: September 2000
  • Laatst online: 06-10 13:59
Nog steeds volledig debiel dat ze je een eigen Task scheduler laten bouwen maar dat is in je andere topic ook al gemeld.

https://niels.nu

Pagina: 1