C# API线程和静态方法

C# API线程和静态方法,c#,asp.net-web-api,C#,Asp.net Web Api,我有一个处理post请求的APIController,它正在调用一个静态类中的静态方法,我想在静态类的静态字典中返回下一个值。例如,一个请求进入,我想查找下一个用于该字典的索引,然后在静态属性值中将该索引增加1。当我一次发送1个调用时,这工作得非常好,但是当2个调用同时传入时,它们都从静态方法中获得保存值 我想做的是找到一种方法来锁定静态方法,这样它就可以一次处理1个线程,这样无论静态方法中同时出现多少个调用,它都会同步运行。这是我正在调用的基本代码。如果同时调用两次,它们都返回相同的值,这不是

我有一个处理post请求的APIController,它正在调用一个静态类中的静态方法,我想在静态类的静态字典中返回下一个值。例如,一个请求进入,我想查找下一个用于该字典的索引,然后在静态属性值中将该索引增加1。当我一次发送1个调用时,这工作得非常好,但是当2个调用同时传入时,它们都从静态方法中获得保存值

我想做的是找到一种方法来锁定静态方法,这样它就可以一次处理1个线程,这样无论静态方法中同时出现多少个调用,它都会同步运行。这是我正在调用的基本代码。如果同时调用两次,它们都返回相同的值,这不是我想要的

public static class Manager
{
  public static Dictionary<string, bool> ServerList { get; set; }
  public static int NumberOfServers { get; set; }
  public static int NextServerIndex { get; set; }

  public static string GetNextServer()
  {
    int indextocheck = NextServerIndex;
    string servername= null;
    if (indextocheck >= NumberOfServers)
      indextocheck = 0;
    while (timer < maxtime)
    {
      if (ServerList.Values.ElementAt(indextocheck) == false)
      {
        servername = ServerList.Keys.ElementAt(indextocheck);
        ServerList[server] = true;
        NextServerIndex = indextocheck + 1;
        break;
      }
      indextocheck++;
      if (indextocheck == NumberOfServers)
        indextocheck = 0;
    }
    return servername
  }
}
公共静态类管理器
{
公共静态词典服务器列表{get;set;}
公共静态int NumberOfServers{get;set;}
公共静态int NextServerIndex{get;set;}
公共静态字符串GetNextServer()
{
int indextocheck=NextServerIndex;
字符串servername=null;
如果(indextocheck>=服务器数量)
indextocheck=0;
while(计时器<最大时间)
{
if(ServerList.Values.ElementAt(indextocheck)==false)
{
servername=ServerList.Keys.ElementAt(indextocheck);
ServerList[server]=true;
NextServerIndex=indextocheck+1;
打破
}
indextocheck++;
if(indextocheck==NumberOfServers)
indextocheck=0;
}
返回服务器名
}
}
显然,我在这里遗漏了一些东西,因为我认为静态方法(在静态类中)将同步运行。我能做些什么来完成我想做的事情

谢谢

您可以使用锁

static object SpinLock = new object();

lock(SpinLock)
{
   //Statements
}
就你而言

hat I am trying to do is find a way to lock the static method so it can process 1 thread at a time so no matter how many simultaneous calls come in the static method runs synchronously. Here is basically the code I am calling. If this gets called twice at the same time they both return the same value, which is not what I want.

public static class Manager
{
  static object SpinLock = new object();
  // Remove the public or protect the get set with a lock
  static Dictionary<string, bool> ServerList { get; set; }
  static int NumberOfServers { get; set; }
  static int NextServerIndex { get; set; }

  public static string GetNextServer()
  {
     lock(SpinLock)
     {

        int indextocheck = NextServerIndex;
        string servername= null;
        if (indextocheck >= NumberOfServers)
          indextocheck = 0;
        while (timer < maxtime)
        {
          if (ServerList.Values.ElementAt(indextocheck) == false)
          {
            servername = ServerList.Keys.ElementAt(indextocheck);
            ServerList[server] = true;
            NextServerIndex = indextocheck + 1;
            break;
          }
          indextocheck++;
          if (indextocheck == NumberOfServers)
              indextocheck = 0;
          }
     }
    return servername;
  }
}
我想做的是找到一种方法来锁定静态方法,这样它就可以一次处理1个线程,这样无论静态方法中同时出现多少调用,它都可以同步运行。这是我正在调用的基本代码。如果同时调用两次,它们都返回相同的值,这不是我想要的。
公共静态类管理器
{
静态对象自旋锁=新对象();
//移除公用或用锁保护get set
静态字典服务器列表{get;set;}
静态int NumberOfServers{get;set;}
静态int-NextServerIndex{get;set;}
公共静态字符串GetNextServer()
{
锁(旋转锁)
{
int indextocheck=NextServerIndex;
字符串servername=null;
如果(indextocheck>=服务器数量)
indextocheck=0;
while(计时器<最大时间)
{
if(ServerList.Values.ElementAt(indextocheck)==false)
{
servername=ServerList.Keys.ElementAt(indextocheck);
ServerList[server]=true;
NextServerIndex=indextocheck+1;
打破
}
indextocheck++;
if(indextocheck==NumberOfServers)
indextocheck=0;
}
}
返回servername;
}
}

如果我错了,请纠正我,但是,如果控制器有一个异步方法调用静态类,就像他描述的那样,那么可能不需要锁,对吗?我相信它仍然是必要的。多个请求仍有可能同时改变
静态
状态。控制器是异步的,但它仍在同时改变静态,因此我的问题我以前不知道锁,但它似乎正在做我需要它做的事情。谢谢