2016-04-07 6 views
0

Ich habe folgendes Setup in einer aspx Seite:C# Pass Multithreading in Variable auf ein Verfahren ursprünglichen Werte beibehalten

Object Original = obj; 
System.Threading.Thread thread = new System.Threading.Thread(() => saveOriginalDetails(Original)); 
thread.Start(); 

Die Grundidee dabei ist, dass ich ein Objekt haben, und ich will es genau sparen wie es ist, bevor Sie Änderungen daran vornehmen.

Also mache ich eine Kopie des ursprünglichen Objekts obj und speichern Sie es als Original

ich einen neuen Thread bin ab, weil die saveOriginalDetails Methode wird nach unten zu viel, den Code zu verlangsamen.

Meine Frage ist, wenn ich dies tun statt:

System.Threading.Thread thread = new System.Threading.Thread(() => saveOriginalDetails(obj)); 
thread.Start(); 

obj.name = "NewName"; 

Wo ich jetzt in das ursprüngliche Objekt vorbei bin, und kopieren Sie sie in der Methode, die gleichzeitig, wie diese ausgeführt wird:

private void saveOriginalDetails(object applicant) 
    { 
     object OriginalApplicant = applicant; 
..... 
} 

Wird das Objekt an die Methode übergeben in:

saveOriginalDetails(obj)); 

Haben Sie den Namen Wert zB aktualisiert ein Name von newName?

+2

Sie kopieren nicht das * Objekt *, Sie kopieren nur seine * Referenz *, Sie haben immer noch nur 1 Objekt im Spiel, aber jetzt haben Sie 2 Referenzen darauf. Wenn Sie das Objekt ändern, ändern Sie nur das eine Objekt. –

+3

@ M.kazemAkhgary: Nein, Objekte werden nicht als Referenz übergeben. Referenzen werden nach Wert übergeben. Es ist wichtig, zwischen diesen zu unterscheiden. Siehe http://pobox.com/~skeet/csharp/parameters.html –

+0

@JonSkeet mein Fehler. Aha. Herr Karlsen sagte es richtig. Danke. @Alex, wenn Sie kopieren möchten, besteht eine Möglichkeit darin, ein neues DuoApplicant zu erstellen, indem Sie 'new DuoApplicant (...);' eingeben und alle Eigenschaften manuell kopieren, wenn möglich oder versuchen Sie es auf diese Weise http://stackoverflow.com/a/16696564/ 4767498 –

Antwort

1

Zuerst nicht Thread verwenden. Verwenden Sie stattdessen die neuen Klassen Task (wenn möglich - Sie haben nicht angegeben, welche .NET-Version Sie verwenden).

Zweitens übergeben Sie nur einen Parameter an die saveOriginalDetails.

Schließlich, wenn Ihre Klasse eine Modellklasse ist (es sieht irgendwie so aus) und serialisierbar ist, können Sie relativ schnell eine perfekte Kopie erstellen, indem Sie sie serialisieren und deserialisieren (was den Vorteil hat, mit zukünftigen Änderungen zu arbeiten) Sie könnten zu Ihrer Klasse machen). Eine schneller arbeitende Lösung (die jedoch mehr Programmierarbeit erfordern würde) wäre, eigenen Code zum Klonen Ihrer Klasse zu schreiben. Abgesehen davon, dass Ihre Klasse wirklich sehr groß und komplex ist, sollte sie serialisiert und deserialisiert werden, obwohl sie nicht die optimale Lösung ist.

Schließlich, es sei denn, Sie haben eine Geschäftsaufgabe, eine Kopie des DuoApplicant-Objekts zu speichern, eine In-Memory-Kopie, wie oben beschrieben, sollte ausreichen.