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吗?如果没有,那么你很好。

另外,你怕什么?如果检查从假变为真或真变为假,你真的在​​乎吗?它不会爆炸——它会返回一个布尔值,而不是抛出异常。

编辑: 不,它不是写的线程安全的,另一个线程可以更改Checkedand ValueName其中没有一个以任何方式以任何顺序受到保护。

于 2012-06-07T15:54:38.390 回答
2

通常,实例成员并非设计为线程安全的。您的代码与 .NET Framework 中的大多数类一样不安全。

除非您的类是专门为与并发相关的场景(例如System.Collections.Concurrent命名空间)而设计的,否则您不必担心使其成为线程安全的;这只会导致实施过于复杂和效率低下。在适用的情况下,线程访问的同步应该是消费代码的责任。

于 2012-06-07T16:33:06.640 回答