2009-03-18 3 views

Antwort

6

Dies ist kein Attribut dafür: Sie müssen die Dokumentation für jedes Element, das Sie interessieren, lesen. Sie können nichts threadsicher machen, indem Sie einfach ein Attribut hinzufügen. Das ist, als würde man eine Orange nehmen und einen Aufkleber darauf anbringen, der "Apple" sagt.

Natürlich gilt das Gleiche für die Serialisierung und es hat sie dort nicht gestoppt, aber immer noch: kein Attribut. Lesen Sie die Dokumentation.

+0

Alle statischen Methoden und Eigenschaften werden standardmäßig Thread-sicher angenommen (dh wenn nicht anders dokumentiert), zum Beispiel Methoden die Annahme ist, dass sie nicht sind. – Richard

+0

Angenommen, eine Methode ist nicht Thread sicher, wenn es keinen Schaden verursacht, vorausgesetzt, dass eine Thread sicher ist, wenn es nicht böse sein kann. Es ist besser, nichts zu befürchten, solange es nicht angezeigt wird. – JoshBerke

1

Ich habe Joel Coehoorn auf diesen einen zurück, wäre leicht zu fälschen solche Ansprüche.

Warum den THREAD Text in der Funktionsbeschreibung nicht hinzufügen

+0

Ich würde mir nicht so viele Sorgen machen, dass ich es "vortäusche". Aber Nebenläufigkeit ist schwer: Es wäre sehr wahrscheinlich, dass ein Fehler durch ist und dieses Attribut nur falsch ist. –

+2

Aber wenn das Attribut falsch ist, ist es wahrscheinlich, dass die Dokumentation (falls vorhanden) genauso falsch ist. –

+0

Ich stimme @JimMischel völlig zu, aber Joel war nicht derjenige, der für die Dokumentation eintrat. Zumindest Attribute sind maschinenlesbar, was zumindest eine automatische Aufzählung, Filterung, Berichterstellung usw. der zugeordneten Methoden und möglicherweise sogar einige schwache Formen der statischen Analyse und/oder Fehlervermeidung erlaubt.Attribute sind der Weg zu gehen, aber Sie würden ein ausgeklügeltes und umfassendes System von ihnen benötigen, um die Nebenläufigkeitssemantik in irgendeiner wirklich nützlichen Weise zu erfassen. Für .NET ist mir kein Design oder Vorschlag bekannt. –

-1

Es gibt kein Szenario eine Klasse synchronisiert zu machen, als Anwendungsfall ist man Codierstil verwenden folgenden weit Verfahren betrifft:

using System.Runtime.CompilerServices; 
[MethodImpl(MethodImplOptions.Synchronized)] 
void MyMethod() 
{ 
DoSomething(); 
} 
+0

Das Problem ist; das impliziert noch immer nicht, dass die Methode threadsicher ist - weil ein anderer Thread eine andere Methode aufrufen könnte, die * nicht die Methode [MethodImpl] hat und sich somit gegenseitig verwirft. Selbst wenn alle Felder schreibgeschützt sind, können Felder auf untergeordneten Objekten ebenfalls veränderbar sein und Probleme verursachen. –

+0

Auch wenn dieser sogenannte "Coding-Stil" * etwas bedeuten könnte (siehe zahlreiche andere Kommentare auf dieser Seite), hat das 'MethodImplOptions.Synchronized'-Flag die gegenteilige Bedeutung dessen, wonach das OP sucht. Dieses Flag soll anzeigen, dass die Methode ** nicht ** Thread-sicher ist. Aus der Dokumentation: "Die Methode kann nur von jeweils einem Thread ausgeführt werden." –

1

Es ist möglich, um alle Zugriff auf Ihr Objekt serielle über IContributeObjectSink/IContextAttribute zu machen, obwohl dies von einem großen Leistungseinbruch leiden wird, da es Ihr Objekt zur Unterklasse MarshalByRefObject, Context Creation Overhead, etc ...

1

Nein, und es wäre sinnlos.

Nehmen wir an, ich einen Thread-sicher-Liste haben, hat es drei Thema Safe ™ Methoden:

void Add(something); 
void Remove(index); 
int GetCount(); 
something GetElementAt(index); 

Thema ein:

for 1 to 100 do 
list.Add(12); 

Thema zwei und drei:

while(list.GetCount() >0) 
{ 
    list.Remove(0); 
} 

Der obige Code stürzt (früher oder später) ab, da sich die Liste zwischen dem Zeitpunkt GetCount und Remove

Verwandte Themen