2014-05-13 18 views
8

Esiste una soluzione alternativa per aggiornare un parametro ref all'interno di un metodo anonimo?Parametro di aggiornamento aggiornamento nel metodo anonimo

So che il metodo anonimo non consente l'accesso ai parametri ref dello scope esterno, ma esiste un altro modo per farlo? Sto usando una libreria esterna per la MessageStream quindi non può modificare gli argomenti del delegato ...

void DoWork(ref int count) 
{ 
    MessageStream Stream = new MessageStream(); 
    Stream.MessageReceived += (o, args) => 
    { 
     //Error cannot use ref or out parameter inside anonymous method 
     count++; 
    }; 
} 
+0

La risposta dipende dal fatto che si possa essere sicuri che 'Stream.MessageReceived' sarà sollevato prima che' DoWork' ritorni. Puoi esserne sicuro? – hvd

+0

conosci il contesto non sicuro? Se no, pubblico una risposta con questa soluzione – faby

+0

@faby, penso di sapere a cosa stai pensando, e se ho ragione, non funzionerà. * Di solito * funzionerà, ma a volte fallirà, e non c'è modo di aggiustarlo in modo che funzioni sempre. – hvd

risposta

5

Nel tuo caso non v'è alcuna valida work-around a questo problema: dal momento in cui le Stream.MessageReceived evento si attiva, il count potrebbe essere al di fuori del campo di applicazione nel chiamante della funzione DoWork.

In situazioni del genere si dovrebbe incapsulare il count in un oggetto, e mantenere un riferimento a tale oggetto sia nel gestore di eventi e il chiamante, in questo modo:

class Counter { 
    public int Value {get;private set;} 
    public void Increment() {Value++;} 
} 
void DoWork(Counter count) { 
    MessageStream Stream = new MessageStream(); 
    Stream.MessageReceived += (o, args) => { 
     count.Increment(); 
    }; 
} 
+0

Possibilmente interbloccato. L'intervento potrebbe essere sensato qui, a seconda dell'uso. – Paddy

+0

Penso che questo sia l'unico modo per raggiungerlo. Un po 'di re-jigging del codice in ordine. Speravo che tutto sarebbe andato bene in qualche modo. – jamos

1

Se si vuole avere la delegate aggiorna una variabile da un outter scope, passa un lambda che imposta il valore invece di passare il conteggio per ref.

//shared var 
private static int _count = 0; 

//call your method 
DoWork(() => _count++); //instead of DoWork(ref _count); 


void DoWork(Action countInc) 
{ 
    MessageStream Stream = new MessageStream(); 
    Stream.Activated += (o, args) => countInc(); 
} 
Problemi correlati