5 messaggi dal 06 febbraio 2011
Un grosso Saluto a tutta la Comunity

Vi scrivo in quanto lavorando con un metodo asincrono è nata l'esigenza di intercettarne il risultato, più chiaramente riporto il frammento di codice che coinvolge la probblematica:

    public class ServiceT
    {
        [OperationContract]
        public string GetPublicKey()
        {
            RSA RSA_Provider = new RSA();
            
            //Attach the KeysGenerated event handler
            RSA_Provider.OnKeysGenerated += KeysGenerated;
            RSA_Provider.GenerateKeys();

        }

        private void KeysGenerated(Object sender)
        {
            RSA RSA_Provider = (RSA)sender;
            string Key = RSA_Provider.ToXmlString();          
        }
    }


Fondamentalmente il mio "RSA_Provider" genera il suo set di chiavi in modo asincrono, quindi quando la generazione è completa viene invocato il metodo KeyGenerated collegato all'evento "RSA_Provider.OnKeysGenerated".
L'esigenza che è nata è quella di far restituire dal metodo del servizio "GetPublicKey" il risultato disponibile in "KeysGenerated".
E' possibile far qualcosa del genere?

Ringrazio anticipatamente chiunque possa intervenire per un aiuto!
Modificato da maverjk il 16 maggio 2011 15.12 -
Il metodo più semplice è interrompere il thread e aspettare l'evento. Per farlo devi usare il ManualResetEvent, che di fatto è un semaforo:
public string GetPublicKey()
{
    RSA RSA_Provider = new RSA();
    ManualResetEvent ev = new ManualResetEvent(false);
    string Key;
            
    //Attach the KeysGenerated event handler
    RSA_Provider.OnKeysGenerated += s => {
        RSA RSA_Provider = (RSA)sender;
        Key = RSA_Provider.ToXmlString();
        ev.Set();
    };
    RSA_Provider.GenerateKeys();
    ev.WaitOne();

    return Key;
}


E' un po' pericoloso se il servizio viene usato intensamente, perché andrebbero usati i metodi asincroni, ma così dovrebbe andare

Ciao

Il mio blog
Homepage
5 messaggi dal 06 febbraio 2011
Salve

Io al momento ho risolto in modo diverso, forse un pò meno convenzionale ma "funge", ciò nonostante proverò anche quanto mi hai postato.

   public class ServiceT
   {
        private Boolean KeysIsGenerated;

        [OperationContract]
        public string GetPublicKey()
        {
            RSA RSA_Provider = new RSA();
            
            //Attach the KeysGenerated event handler
            RSA_Provider.OnKeysGenerated += KeysGenerated;
            RSA_Provider.GenerateKeys();

            KeysIsGenerated = false;

            while (!KeysIsGenerated)
            {
               System.Threading.Thread.Sleep(TimeSpan.FromMilliseconds(100));
            }

            string Key = RSA_Provider.ToXmlString(); 
            return Key;
        }

        private void KeysGenerated(Object sender)
        {
            KeysIsGenerated = true;         
        }

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.