2016-06-09 5 views
7

Fondamentalmente, ho alcune classi che chiamano un vuoto statico che fornisce argomenti (used in an ASP website).I metodi statici con argomenti out thread sono sicuri?

Da quanto ho capito perché il vuoto ha il proprio stack, è thread-safe, tuttavia non sono del tutto sicuro che questo sia vero quando vengono utilizzati gli outs. Qualcuno può chiarire il problema. Grazie!

namespace ThreadTest 
{ 
class Program 
{ 
    static void Main(string[] args) 
    { 
     int helloWorldint = 0; 
     bool helloWorldbool = false; 

     int helloWorldintOut = 0; 
     bool helloWorldboolOut = false; 

     setHelloWorlds(helloWorldint, helloWorldbool, out helloWorldintOut, out helloWorldboolOut); 


     Console.WriteLine(helloWorldintOut); 
     Console.WriteLine(helloWorldboolOut); 
    } 

    public static void setHelloWorlds(int helloWorldint, bool helloWorldbool, out int helloWorldintOut, out bool helloWorldboolOut) 
    { 

     helloWorldintOut = helloWorldint + 1; 
     helloWorldboolOut = true; 

    } 
} 
} 
+2

Dove entrano in gioco i fili? – Markus

+1

@Markus ASP Sito web stesso pool di applicazioni – user6445891

+1

Perché non restituire gli oggetti anziché utilizzare gli outs? –

risposta

2

Dalla documentazione MSDN:

La parola chiave fuori causa gli argomenti da passare per riferimento. Questo è come la parola chiave ref, tranne che ref richiede che la variabile sia inizializzata prima di essere passata. Per utilizzare un parametro out, sia la definizione del metodo sia il metodo di chiamata devono utilizzare esplicitamente la parola chiave out.

Quindi la risposta alla domanda dipende da come si chiama il metodo statico. Poiché la variabile viene passata per riferimento, se si hanno più thread che chiamano il metodo AND stanno passando nella stessa variabile riferimenti come parametri (anche se quei parametri sono tipi di valore poiché OUT causa il passaggio per l'esplicita di riferimento) allora il metodo non è thread-safe. D'altra parte, se più thread chiamano il tuo metodo, ognuno passando nei propri riferimenti alle variabili, allora il tuo metodo sarebbe thread-safe.

Questo non è proprio specifico per i modificatori OUT o REF. Qualsiasi metodo che modifica i dati su un tipo di riferimento non è intrinsecamente thread-safe, e dovresti considerare attentamente il motivo per cui sceglierai di percorrere quella rotta. In genere, affinché un metodo sia protetto da thread, dovrebbe essere molto ben incapsulato.

+0

Grazie per il riferimento DVk – user6445891

3

Il modo in cui si chiama il metodo statico, non sarebbe thread-safe, in quanto condivide i riferimenti. Ma se si restituisce un valore dal proprio metodo e tale variabile viene creata nel metodo, potrebbe essere protetta da thread.

static int MyMethod(int input) 
{ 
    var output= 2; 
    ... 
    return output; 
} 
+2

Ciò significa in generale in quanto, outs non può essere considerato threadsafe – user6445891

+1

Sì. Come stanno puntando a un riferimento che viene condiviso al di fuori del metodo. – akazemis