Как я могу заблокировать закрытое статическое поле класса в одном статическом методе, а затем освободить его в другом методе экземпляра? - PullRequest
0 голосов
/ 26 марта 2011

У меня есть личное статическое поле в классе Controller в веб-приложении MVC.

У меня есть статический метод в этом контроллере, который присваивает какое-то значение этому статическому полю, я хочу применить блокировку к этому статическому полю, пока какой-нибудь другой метод экземпляра в контроллере не использует значение, сохраненное в статическом поле, а затем освобождает его.

Как я могу это сделать?

ОПИСАНИЕ:

У меня есть контроллер с именем BaseController, имеющий статическое поле ClientId следующим образом и два метода следующим образом: -

public static string ClientId = "";

static void OnClientConnected(string clientId, ref Dictionary<string, object> list)
        {
            list.Add("a", "b");
// I want the ClientId to be locked here, so that it can not be accessed by other requests coming to the server and wait for ClientId to be released:-
            BaseController.clientId = clientId; 
        }

public ActionResult Handler()
        {
            if (something)
            {
                // use the static ClientId here
            }
// Release the ClientId here, so it can now be used by other web requests coming to the server.
            return View();
        }

1 Ответ

2 голосов
/ 26 марта 2011

Вы не можете просто использовать блокировку, чтобы ждать, когда вам понадобится AutoResetEvent (или эквивалентный). Нечто подобное может оказаться полезным:

// Provide a way to wait for the value to be read;
// Initially, the variable can be set.
private AutoResetEvent _event = new AutoResetEvent(true);

// Make the field private so that it can't be changed outside the setter method
private static int _yourField;

public static int YourField {
    // "AutoResetEvent.Set" will release ALL the threads blocked in the setter.
    // I am not sure this is what you require though.
    get { _event.Set(); return _yourField; }

    // "WaitOne" will block any calling thread before "get" has been called.
    // except the first time
    // You'll have to check for deadlocks by yourself
    // You probably want to a timeout in the wait, in case
    set { _event.WaitOne(); _yourField = value; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...