martedì 9 luglio 2013

Lanciare un thread un processo lungo su un thread separato

Riporto la discussione su cui ho partecipato nel forum microsoft:

Pagina lancia un exe - problema di sicurezza

Diego Riccardi scrive:

Salve a tutti,
da una pagina web lancio un exe scritto da me in vb.net che si collega ad un webservice presente nello stesso sito.
Quando faccio click sul pulsante per lanciare l'eseguibile, mi restituisce l'errore: L'applicazione ha tentato di eseguire un'operazione non consentita dai criteri di sicurezza. Per attribuire all'applicazione le autorizzazioni necessarie, contattare l'amministratore del sistema oppure modificare il livello di attendibilità dell'applicazione nel file di configurazione.
Per eseguire il file ho scritto:
Process.Start(file, IdOperazione.ToString)

Dove file contiene il percorso del file e IdOperazione è un parametro che passo all'eseguibile.
Logicamente in locale nel mio ambiente di sviluppo funziona tutto bene, ma quando pubblico sul server di aruba mi ritorna l'errore di cui sopra.
Suggerimenti?
Grazie
---
Luca Congiu:
Le policy di sicurezza dei server di Aruba non ti permettono di eseguire dei batch (exe) sui loro server di hosting a meno che questi non siano server dedicati.
Se non sbaglio mi pare che Aruba metta a disposizione delle operazioni pianificate, potresti provare con quello
Ciao
---

Diego Riccardi
Capito, grazie per la risposta.
In pratica io ho fatto questo exe perchè le operazioni che compie impiegano parecchio tempo e avevo paura che se le avessi eseguite da una pagina web o direttamente dal webservice, la pagina potrebbe andare in timeout e interrompere le operazioni prima di finirle.
Che tu sappia è così che funziona? O potrei mettere tutta la logica che ho messo nell'exe direttamente nel webservice e richiamarne il webmethod?
Grazie ancora

---

Luca DaLsass:
Se è un'operazione che può essere fatta in asincrono e non puoi usare dei servizi puoi comunque provare a lanciare un thread parallelo.

 var t = new Thread(() =>
{
    /* metodo statico a cui passi parametri per lavorare in autonomia */
});
t.Start();

Accertati di tenere traccia dello stato dell'esecuzione in un file o su database (come avresti fatto per l'eseguibile), di modo da capire se il thread stà andando avanti ed eventualmente inibire la possibilità di lanciare più istanza in contemporanea.
Buon Lavoro

-----

Diego Riccardi

Grazie per la risposta.
Tuttavia qualcosa non mi è chiaro. perché dici che "non posso usare de servizi"? Ti riferisci a servizi di Windows o a web service?
Inoltre, utilizzando il processo asincrono (con tutti i controlli del caso per verificare che non sia già in esecuzione un' altra istanza), in pratica la pagina lancia il processo asincrono che dura parecchio tempo, a questo punto non c'è sempre il problema che la pagina vada in timeout e anche il thread asincrono venga "killato", o no? Scusa ma non ho molta esperienza con i processi asincroni!

----

Luca Congiu 
La chiamata asincrona ti è utile per non bloccare il thread corrente. Per il timeout della pagina puoi anche modificare il web.config per aumentarlo.

------
Luca Dalsass

Se lanci il tuo processo su un thread separato non dovrebbe influire sul time out della pagina.
Il thread parte e l'esecuzione della pagina prosegue.
Detto semplicemente puoi costruire una pagina, che lancia il thread e restituisce in messaggio all'utente
"Operazione avviata".
Per sapere a che punto è la tua lunga operazione puoi fare un'altra pagina, che risponde adeguatamente, leggendo un log lasciato dal tuo processo, che sul server stà continuando a girare oppure nel frattempo è giunto a conclusione..

Link alla discussione :  clicca qui



Nessun commento:

Posta un commento