0

ここで「スピンロック」を正常に実装したと思いますが、このようなもののベストプラクティスを調査したかった.

Interlocked クラスを使用する必要がありますか? もしそうなら、どのメソッドがブール値型に適していますか? それ以外の場合、これを達成するための正しい方法は何ですか (私の方法がまだない場合)?

// 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();
    }
}
4

1 に答える 1

1

を再実装しようとしているとのことですがManualResetEvent

Set()メソッドとWaitOne()メソッドを見てください。これらはあなたが探しているものかもしれません。

于 2012-04-14T05:02:30.477 に答える