c # - Sporing af flere processer på samme tid

Indlæg af Hanne Mølgaard Plasc

Problem





 Jeg har en applikation (winforms), der overfører en fil til brugerens midlertidige mappe, så åbner filen filen for brugeren for at se indholdet, og når filen er lukket, bliver filen slettet fra tempmappen. Programmet virker ok, hvis Jeg åbner lad os sige en .pdf og en .doc Problemet vises, når du forsøger at åbne en .doc, hvis en anden winword-proces stadig kører (betyder ikke noget om, hvis der åbnes af min app eller direkte af brugeren).


Jeg bruger følgende kode:


\_OpenFileProces = System.Diagnostics.Process.Start(TempFileName);
\_OpenFileProces.EnableRaisingEvents = true;
\_OpenFileProces.Exited += new EventHandler(\_OpenFileProces\_Exited);


og denne for at rydde temp


void \_OpenFileProces\_Exited(object sender, EventArgs e)
    {
        string s = ((System.Diagnostics.Process)sender).StartInfo.FileName;
        System.IO.File.Delete(s);
    }


Det lader til, at køringsprocessen stopper mit eget .. og på grund af at stoppe det vil slette filen, eller det vil generere en fejl under forsøget på at slette filen.

Har du noget forslag, hvordan kan jeg åbne min egen proces? Det er jeg ved ikke, hvilken filtype jeg skal åbne (det kunne være alt), og jeg regner med at vælge den bedste applikation. Fra min test virker notesblokken ok, men winword og acrobat lukker min proces.

tak skal du have

Bedste reference


Jeg formoder, at Microsoft Word gør nøjagtig det samme her, som Raymond Chen beskriver Windows Shell som gør her: [8]



  En kunde ønskede hjælp til at overvåge levetiden på et Explorer-vindue.

  
  

    ' Vi vil starte en kopi af Explorer for at åbne en bestemt mappe, og vent derefter, indtil brugeren lukker mappen, inden vi fortsætter. Vi forsøgte at lancere en kopi af Explorer med mappen på kommandolinjen og derefter lave et WaitForSingleObject på behandle håndtaget, men ventetiden afslutter undertiden uden at vente. Hvordan venter vi, indtil brugeren lukker Explorer-vinduet? '

  

  
  Dette er et andet tilfælde at løse et problem halvvejs og derefter have problemer med den anden halvdel.

  
  Grunden til, at Wait­For­Single­Object vender tilbage, er, at Explorer er et enkelt-instansprogram (godt, begrænset eksempel). Når du åbner et Explorer-vindue, afsendes anmodningen til en løbende kopi af Explorer, og kopien af ​​Explorer du lancerede udgange. Det er derfor din Wait­For­Single­Object vender tilbage straks.



I dit tilfælde kører Word allerede, så når du opretter en anden Word-proces og instruerer den om at åbne dit dokument, henvender det blot henvendelsen til forekomsten af ​​Word, der allerede kører, og afsluttes Den anden proces du startede med det samme.


Det er det du ser når du beskriver, at 'køringsprocessen stopper mit eget'. Fordi denne anden instans bliver lukket umiddelbart efter du har startet det, hæves Exited -hændelsen, og din kode fortæller det at slette filen!


Du bemærker, at Notepad (i modsætning til Word og Adobe Acrobat) virker helt fint. Det er fordi Notepad er designet til at være en multiple-instans applikation. Du kan åbne så mange kopier af Notesblok som du vil, det er ligeglad, hvis der allerede er 1 eller 6 kopier åbnet på skrivebordet. Og vigtigere, spørger skalen om at åbne et tekstdokument i Notesblok, åbner faktisk en anden kopi af Notesblok-applikationen, snarere end at sende en anmodning til første -eksemplet for at åbne et nyt vindue til nyt dokument.

Andre referencer 1


Du bør indstille Process.StartInfo.UseShellExecute til true som denne \_OpenFileProces.StartInfo.UseShellExecute = true; før du starter processen, og så skal det fungere, tror jeg ...