ASP.NET代码隐藏类中的静态方法是否是非线程安全的?
如果不使用任何实例成员,我可以在ASP.NET Pages
和UserControls
类中使用static
方法吗? 即:
protected void gridView_PageIndexChanging(object sender, GridViewPageEventArgs e) { gridStatement.DataSource = CreateDataSource(); gridStatement.PageIndex = e.NewPageIndex; gridStatement.DataBind(); } private static DataTable CreateDataSource() { using (var command = new SqlCommand("SELECT foobar")) { var table = new DataTable(); new SqlDataAdapter(command).Fill(table); return table; } }
或者这不是线程安全的?
是的,您可以使用静态成员 – 它们是线程安全的。 每个线程将在单独的上下文中执行,因此在静态方法内创建的任何对象将只属于该线程。
如果静态方法正在访问静态字段(例如列表),则只需要担心。 但在您的示例中,代码绝对是线程安全的。
没有在线程之间共享,所以它是线程安全的。 除非你访问静态成员,否则其他静态方法有可能与它同时执行…
它是。 在您的上下文中,关于线程安全性唯一要担心的是涉及静态成员的概念,如前所述。 当任何方法(静态或非静态)访问静态成员时,您应该担心multithreading问题。 考虑以下:
public class RaceConditionSample { private static int number = 0; public static int Addition() { int x = RaceConditionSample.number; x = x + 1; RaceConditionSample.number = x; return RaceConditionSample.number; } public int Set() { RaceConditionSample.number = 42; return RaceConditionSample.number; } public int Reset() { RaceConditionSample.number = 0; return RaceConditionSample.number; } } RaceConditionSample sample = new RaceConditionSample(); System.Diagostics.Debug.WriteLine(sample.Set()); // Consider the following two lines are called in different threads in any order, Waht will be the // output in either order and/or with any "interweaving" of the individual instructions...? System.Diagostics.Debug.WriteLine(RaceConditionSample.Addition()); System.Diagostics.Debug.WriteLine(sample.Reset());
答案是:它可能是“42,43,0”,“42,0,1”,你以前不知道..
上述就是C#学习教程:ASP.NET代码隐藏类中的静态方法是否是非线程安全的?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1013595.html