2012-04-14 1 views
0

Ich glaube, ich habe hier ein "Spin Lock" erfolgreich implementiert, aber ich wollte die Best Practice für so etwas untersuchen.Wie soll ich einen Bool-Thread für dieses Beispiel eines Web-Service-Konstruktors, der sich automatisch anmeldet, sicher machen?

Sollte ich die Interlocked-Klasse verwenden? Wenn ja, welche Methode ist für einen Bool-Werttyp geeignet? Ansonsten, was ist der richtige Weg, um dies zu erreichen (wenn mein Weg nicht schon ist)?

// This is a class to encapsulate a bool value that can be used 
// as a signal from one thread to another. 
public class Condition 
{ 
    private object locker = new object(); 
    private bool isDone; 

    public void Wait() 
    { 
     while (true) if (!this.Done) Thread.Sleep(100); else break; 
    } 

    public void Set() 
    { 
     this.Done = true; 
    } 

    private bool Done 
    { 
     get { lock (this.locker) { return this.isDone; } } 
     set { lock (this.locker) { this.isDone = value; } } 
    } 
} 

// This is an extension to a WSDL generated web service. 
// The idea is to login to the web service as part of instance construction. 
public partial class SforceService 
{ 
    private Condition done = new Condition(); 

    public SforceService(string login, string password) 
     : this() 
    { 
     this.loginCompleted += new loginCompletedEventHandler(SforceService_loginCompleted); 
     this.loginAsync(login, password); 
     this.done.Wait(); 
    } 

    void SforceService_loginCompleted(object sender, loginCompletedEventArgs e) 
    { 
     var loginResult = e.Result; 
     this.SessionHeaderValue = new SessionHeader(); 
     this.Url = loginResult.serverUrl; 
     this.SessionHeaderValue.sessionId = loginResult.sessionId; 
     this.done.Set(); 
    } 
} 

Antwort

1

Ich verstehe, dass Sie versuchen, eine ManualResetEvent Reimplementierung.

Schauen Sie sich die Methoden Set() und WaitOne() an, sie könnten das sein, wonach Sie suchen.

+0

Ich wusste nicht, dass Klasse existiert, danke. –

+0

Multithread-Code? Überprüfen Sie zunächst, welche Synchro-Primitive/Objekte in Ihrem Betriebssystem/Ihrer Sprache verfügbar sind. –

Verwandte Themen