.NET 里 静态方法的并发处理
静态方法在程序运行时 就已经实例化好了 不管多少用户并发 都一样处理,不需要排队等待,实例代码:
namespace DotNet.Example { using DotNet.BaseManager; public class StaticTest { /// <summary> /// 定义委托 /// </summary> /// <param name="user">用户</param> delegate void MakeStaticDelegate(string user); /// <summary> /// 这里是测试静态方法 /// </summary> /// <param name="user">用户</param> private static void MakeStaticTest(string user) { for (int i = 0; i < 10; i++) { // 输出当前的变量 System.Console.WriteLine(user + ":" + i.ToString()); System.Threading.Thread.Sleep(1000); } } /// <summary> /// 这里是模拟多用户同时点击并发 /// </summary> public void DoTest() { // 模拟3个用户的并发操作 MakeStaticDelegate makeStaticDelegate1 = new MakeStaticDelegate(MakeStaticTest); makeStaticDelegate1.BeginInvoke("user1", null, null); MakeStaticDelegate makeStaticDelegate2 = new MakeStaticDelegate(MakeStaticTest); makeStaticDelegate2.BeginInvoke("user2", null, null); MakeStaticDelegate makeStaticDelegate3 = new MakeStaticDelegate(MakeStaticTest); makeStaticDelegate3.BeginInvoke("user3", null, null); System.Console.ReadLine(); } }
静态变量的话 并发就不行了 得加锁排队
可静态方法只是一段代码 理论上并不占用运行内存 并不存在并发的问题。
不管方法是否静态 只要方法中的变量有静态的 就得排队
而静态方法只是一段代码没有锁的问题
我们常见的SqlHelper也可以写成非静态方法 可是这样每次使用都得实例化一次 不是很麻烦吗? 它里头只是方法 不涉及变量 所以全用静态了
总之 涉及变量了 最好不要用静态 当然 方法内部的变量不算 我指的是public或protect的变量。
静态的速度快,占内存。动态的速度相对慢些,但调用完后,立即释放类,可以节省内存,可以根据自己的需要选择是用动态方法还是静态方法