我有一个静态计时器类,任何网页都会调用它来计算每个页面构建的时间.
我的问题是静态类线程安全吗?在我的示例中,并发用户会导致启动和停止时间出现问题吗?例如,不同的线程覆盖我的开始和停止值.
public static class Timer
{
private static DateTime _startTime;
private static DateTime _stopTime;
/// <summary>
/// Gets the amount of time taken in milliseconds
/// </summary>
/// <returns></returns>
public static decimal Duration()
{
TimeSpan duration = _stopTime - _startTime;
return duration.Milliseconds;
}
public static void Start()
{
_startTime = DateTime.Now;
}
public static void Stop()
{
_stopTime = DateTime.Now;
}
}
Run Code Online (Sandbox Code Playgroud)
这个类应该是非静态类吗?
(这个类将从asp.net主页调用.)
我正在进行一项性能测试,该测试涉及几个客户,每个客户尽可能快地轰炸服务器150个请求.
服务器由3个WCF服务构成,一个通过httpbinding向外部打开,它通过net.pipe(IPC)与另外两个服务进行通信.其中一项服务负责数据库连接(SQL server 2008 R2).
此DB连接服务使用以下连接字符串增强:
Min Pool Size=20; Max Pool Size=1000; Connection Timeout=20;
Run Code Online (Sandbox Code Playgroud)
并且受WCF限制(与所有其他WCF服务一样).
我注意到当我激活1个客户端时可能需要3秒钟,但是当我激活3个客户端时,它可能需要8到9个或更多.
我检查了SQL服务器分析器,看看有多少并发进程使用,我看到只使用了大约8个进程.
所以我意识到在服务器中的某个地方请求排队而不是同时处理.
为了找到它的底部,我使用了一个性能分析器(确切地说是ANTS),它向我展示了大约70%的时间浪费在"等待同步"
当我打开调用图时,我发现两件看起来很奇怪的东西,但我不确定它们是什么意思:
我注意到数据库连接服务使用的是DAL项目(遗憾的是一些遗留代码),这是完全静态的.
阅读本文之后,我不确定DAL的代码是否存在问题,这里是存储过程调用的示例.
public static int PerformStoredProcedure(string storedP,string ext,out string msg)
{
msg = "";
SqlCommand command = GetSqlCommand(storedP,ext);
command.Connection.Open();
int result = (int)PerformStoredProcedure(command,out msg);
command.Connection.Close();
return result;
}
Run Code Online (Sandbox Code Playgroud)
通常从DB连接服务调用此方法:
public static int PerformStoredProcedureWithParams(string storedP,string ext,out string msg, params object[] pars)
{
msg = "";
SqlCommand command = GetSqlCommand(storedP,ext);
UpdateCommandParams(command, pars);
command.Connection.Open();
int result = …Run Code Online (Sandbox Code Playgroud) 这个方法是线程安全的吗?好像它不是......
public static void Foo(string _str, Guid _id)
{
_str = _str + _id.ToString();
/*
Do Stuff
*/
return
}
Run Code Online (Sandbox Code Playgroud) 这段代码线程安全吗?
DoStuff 使用Task在新线程中调用.
Task.Factory.StartNew(() => DoStuff());
Run Code Online (Sandbox Code Playgroud)
private void DoStuff()
{
List<SalesRecord> salesRecords = new List<SalesRecord>();
SalesRecord salesRecord1 = new SalesRecord {Amount = 10.0, Sales = 1};
SalesRecord salesRecord2 = new SalesRecord {Amount = 15.0, Sales = 1};
SalesRecord salesRecord3 = new SalesRecord {Amount = 1.0, Sales = 2};
salesRecords.Add(salesRecord1);
salesRecords.Add(salesRecord2);
salesRecords.Add(salesRecord3);
SalesRecord result = Util.SumSales(salesRecords);
}
Run Code Online (Sandbox Code Playgroud)
一个只用于存储数据的结构:
public struct SalesRecord
{
public uint Sales;
public double Amount;
}
Run Code Online (Sandbox Code Playgroud)
东西
public static class Util
{
public static SalesRecord SumSales(List<SalesRecord> records)
{ …Run Code Online (Sandbox Code Playgroud)