0

こんなクラスがあります。

public abstract class HtmlObject<T>
{

    public HtmlObject() {}
    public HtmlObject(string id, string name, T value)
    {
        this.ID = id;
        this.Name = name;
        this.Value = value;
    }

    public string ID { get; set; }
    public string Name { get; set; }
    public T Value { get; set; }

    public abstract string Build();
}

このような具体的な実装を使用します。

public class HtmlRadio : HtmlObject<string>
{
    private const string RadioHtml = "<input type='radio' name='{0}' value='{1}' {2} />{1}<br />";

    public bool Checked { get; set; }

    public override string Build()
    {
        if (this.Checked) 
            return string.Format(HtmlRadio.RadioHtml, this.Name, this.Value, "checked='checked'");
        else
            return string.Format(HtmlRadio.RadioHtml, this.Name, this.Value, string.Empty);
    }
}

そして、私が知りたいのは、呼び出しがBuild()スレッド間で行われた場合に安全かどうかです。私の仮定は、次の一連の呼び出しを行う場合、そうではないということです

HtmlRadio radio = new HtmlRadio();
radio.Checked = false;
//Something could happen here?
string result = radio.Build();

私の理解では、 の値は、radio.Checked設定されてから への呼び出しの間で変化する可能性がありますがBuild()、これは正しいですか? もしそうなら、どうすればこれを「修正」できますか?

4

2 に答える 2

5
IHtmlRadio radio = new HtmlRadio();
radio.Checked = false;
//Something could happen here only if you give `radio` to another thread somehow.
string result = radio.Build();

別のスレッドがアクセスできますradioか? そうでない場合は、問題ありません。

さらに、あなたは何を恐れていますか?チェックが false から true または true から false に変更された場合、本当に気にしますか? 爆発することはありません-例外をスローするのではなく、ブール値を返します。

編集: いいえ、書かれているようにスレッドセーフではありません。別のスレッドが変更される可能性がありますCheckedand ValueNameどの順序でも保護されていません。

于 2012-06-07T15:54:38.390 に答える
2

一般に、インスタンス メンバーはスレッド セーフになるようには設計されていません。あなたのコードは、.NET Framework の大部分のクラスと同じくらい安全ではありません。

クラスが同時実行関連のシナリオ (名前空間など) 用に特別に設計されていない限り、クラスをSystem.Collections.Concurrentスレッドセーフにすることについて心配する必要はありません。これは、過度に複雑で非効率的な実装になるだけです。スレッド化されたアクセスの同期は、該当する場合、消費するコードの責任である必要があります。

于 2012-06-07T16:33:06.640 に答える