2

NIDネストされたプライベート クラスを持つ次のクラスがあり、 toの値を割り当てたいと思いContextます。私はゲッターとセッターを使用しましたが、( ) の値がNID( Sequencer.Context = value;) に割り当てられることはありませんSeqNode = Node.LoadNode(Context);。私は何を間違っていますか?

//Instantiation
Increment.NID = "/Root/Dir/NodetoIncrement";
String getSequence = Convert.ToString(Increment.SID);

// The Class
public static class Increment
{
    //Value of the node Context location in the tree to increment ( Increment.NID )
    public static string NID
    {
        set { Sequencer.Context = value; } //The "/Root/Dir/NodetoIncrement";
    }

    //Get the sequence ID
    public static int SID
    {
        get { return Sequencer.GetSeqId; }
    }

    //Nested sequencer class. This increments the node.

    private class Sequencer
    {   
        private Node SeqNode;
        private static int SequenceNumber;
        private volatile bool Run = true;

        public static string Context { get; set; } //gets 

        public static int GetSeqId
        {
            get
            {
                return Interlocked.Add(ref SequenceNumber, 1);
            }
        }

        public Sequencer() //Constructor Here!
        {
            SeqNode = Node.LoadNode(Context);
            SequenceNumber = Convert.ToInt16(SeqNode["LastSequenceNo"]);

            //NEVER DO THIS .. causes the system to lockup see comments.
            System.Threading.Tasks.Task.Factory.StartNew(() =>
            {
                while (Run)
                {
                    Save();
                    Thread.Sleep(5000);
                }
            });
        }

        private void Save()
        {
            //optimistic concurrency recommended!!
            var retryMaxCount = 3;             // maximum number of attempts
            var cycles = 0;                    // current attempt
            Exception exception = null;        // inner exception storage
            while (cycles++ < retryMaxCount)   // cycle control
            {
                try
                {
                    SeqNode["LastSequenceNo"] = Convert.ToString(SequenceNumber);
                    SeqNode.Save();

                    // successful save, exit loop
                    exception = null;
                    break;
                }
                catch (NodeIsOutOfDateException e)
                {
                    exception = e; // storing the exception temporarily
                    SeqNode = Node.LoadNode(Context);
                }
            }
            // rethrow if needed
            if (exception != null)
                throw new ApplicationException("Node is out of date after 3 attempts.", exception);
        }


        ~Sequencer() { Save(); }

    }
}

public class XYHandler : Node
{
    public override void Save(NodeSaveSettings settings)
    {
        base.Name = Convert.ToString(Increment.SID);
        base.Save();
    }

    public override bool IsContentType
    {
        get { return true; }
    }
}
4

3 に答える 3

0

ここで何らかの一時的な結合が行われていますか?

SeqNodeがインスタンス化されたときに設定さSequencerれますが、サンプルにインスタンス化が表示されません。

静的コンストラクターは、プロパティ セッターが最初に呼び出される前に実行され、5 秒後に再試行されます。プロパティはいつ設定されますか?

于 2013-10-12T00:12:24.943 に答える