相关疑难解决方法(0)

静态方法是否安全

我有一个静态计时器类,任何网页都会调用它来计算每个页面构建的时间.

我的问题是静态类线程安全吗?在我的示例中,并发用户会导致启动和停止时间出现问题吗?例如,不同的线程覆盖我的开始和停止值.

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主页调用.)

c# asp.net static

57
推荐指数
4
解决办法
4万
查看次数

为什么我的应用程序如此等待同步?

我正在进行一项性能测试,该测试涉及几个客户,每个客户尽可能快地轰炸服务器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%的时间浪费在"等待同步"

当我打开调用图时,我发现两件看起来很奇怪的东西,但我不确定它们是什么意思:

  1. System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke正在树的顶部使用,是否可以进行并发处理?
  2. 所有同步问题都涉及某种SQL Server活动,如ExecuteNonQuery,ExecuteReader等(当我到达调用树的底部时)

我注意到数据库连接服务使用的是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)

.net c# concurrency wcf sql-server-2008

9
推荐指数
1
解决办法
2235
查看次数

C# - 参数在静态方法中是否安全?

这个方法是线程安全的吗?好像它不是......

public static void Foo(string _str, Guid _id)
{
    _str = _str + _id.ToString();

    /*
        Do Stuff 
    */

    return 
}
Run Code Online (Sandbox Code Playgroud)

c# static multithreading static-members thread-safety

5
推荐指数
2
解决办法
3853
查看次数

C#线程安全代码

这段代码线程安全吗?

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)

c# multithreading

1
推荐指数
1
解决办法
253
查看次数