API потоки и методы c - PullRequest
       3

API потоки и методы c

2 голосов
/ 13 февраля 2020

У меня есть APIController, обрабатывающий почтовые запросы, который вызывает метод stati c в классе stati c, и я хочу вернуть следующее значение в словаре stati c в классе stati c. Например, поступает запрос, и я хочу найти следующий индекс для использования в этом словаре, а затем увеличить этот индекс на 1 в значении свойства stati c. Это прекрасно работает, когда я отправляю вызовы по 1 за раз, но когда одновременно поступают 2 вызова, они оба возвращают значение сохранения из метода stati c.

Я пытаюсь найти способ заблокировать метод stati c, чтобы он мог обрабатывать 1 поток за раз, независимо от того, сколько одновременных вызовов поступает в методе stati c, выполняется синхронно. Вот в основном код, который я звоню. Если это вызывается дважды одновременно, они оба возвращают одно и то же значение, а это не то, что я хочу.

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
  }
}

Очевидно, что я что-то здесь упускаю, так как думал, что метод stati c (в классе stati c) будет работать синхронно. Что я могу сделать, чтобы выполнить sh то, что я пытаюсь сделать?

Спасибо!

1 Ответ

1 голос
/ 13 февраля 2020

Вы можете использовать замок

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;
  }
}
...