Domanda

Sto usando il thread che riceverà messaggi dal applicazione esterna. Quindi il mio thread dovrebbe essere sempre vivo.

Voglio che il mio thread esegua l'applicazione, fino all'uscita dell'applicazione. Attualmente sto chiamando il mio thread in program.cs, che è l'avvio per l'applicazione Windows c #. Si prega di consultare il codice qui sotto per sapere come lo sto facendo.

Quando utilizzo il codice seguente, il thread si avvia quando l'applicazione inizia ... Ma si interrompe in qualche modo dopo la ricezione del thread  un messaggio dall'applicazione esterna.

Spero di essere chiaro con la mia questio. Per favore aiuto. Grazie.


  static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        StartThread();
        Application.Run(new Screensaver());
    }
    public static void StartThread()
    {
            DeamonEngine Deamon = new DeamonEngine();
            Thread ThreadReciever = new Thread(Deamon.Receiver);
            if (!(ThreadReciever.IsAlive))
            {
                ThreadReciever.Start();
            }
        }
    }

Da un commento:

    void Receiver() { 
        try { 
            Initiate socket s; 
            Bind Ip address; 
            s.Receiver[bytes]; 
            Access the members of message received in bytes;
            Assign the members of message to local variable;
            Read Xml File, get the node values and write to batch file; 
            Execute batch file. 
        } 
        catch { } 
    }
È stato utile?

Soluzione

Avere un thread che esegue il metodo Receiver non significa che il thread eseguirà ripetutamente il metodo.

Dato il codice di elaborazione nella domanda, Daemon.Receiver deve essere eseguito in un ciclo in modo che possa tornare indietro e recuperare il messaggio successivo per l'elaborazione. Dovrebbe assomigliare a questo:

void Receiver() { 
    while(!done) // without this loop, only one execution will occur
    {
        try { 
            // do stuff
        } 
        catch { 
            // log/handle error
        } 

        // wait for next message
    }
}

Altri suggerimenti

Tipicamente il tuo DaemonReceiver avrebbe un codice come questo

while (!quit) 
{
  --- do work ---
  Thread.Sleep(1000);
}

Ciò mantiene attivo il thread fino a quando non si imposta la variabile globale quit nel thread principale.

Inoltre, è molto importante non lasciare fuoriuscire eccezioni dal thread. Queste eccezioni non verranno segnalate da nessuna parte e causeranno errori silenziosi, probabilmente ciò che stai riscontrando ora. Cattura tutto e almeno riferiscilo.

Il tuo codice di avvio sembra a posto: la mia prognosi è che c'è qualcosa di sbagliato in DaemonEngine.Receiver () , forse viene generata un'eccezione o forse la funzione stessa è strutturata per gestire solo un singolo messaggio. .. Senza vedere la funzione esatta è difficile da dire.

Modifica

Per ottenere la mia roba dai miei commenti:

QUALCOSA sta andando male per uccidere il tuo thread. Eccezione, errore logico, non posso dirti cosa, perché non c'è codice di ciò che sta accadendo nel tuo thread, ma sta succedendo qualcosa. Non ha nulla a che fare con il codice che hai già pubblicato che consente semplicemente di avviare il thread, non di mantenerlo attivo

Inoltre, dal codice che hai pubblicato, stai semplicemente gettando via il fatto che c'era un'eccezione ... Non ho un link a portata di mano, ma ingoiare eccezioni del genere è orribile . Soprattutto all'interno di un thread in cui comunque non si presentano come normali.

Non c'è inoltre alcuna indicazione di un ciclo di alcun tipo, quindi potrebbe essere uno o entrambi i miei suggerimenti sopra che sta causando problemi.

È possibile che si stia verificando un'eccezione nel thread che non viene rilevato. Prova a mettere alla prova il metodo in esecuzione e verifica se stai ricevendo un'eccezione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top