Контекст для этого вопроса - приложение WPF.Приложения WPF используют DispatcherSynchronizationContext.
Если у меня в приложении есть кнопка, которая вызывает метод-обработчик Button_Click, и я хочу убедиться, что весь код в этой функции выполняется только одним потоком, я бы обернул ее в семафор, как показано?Но я не понимаю, как это работает.
Если предположить, что кнопка была нажата, мы нажмем WaitAsync (), которая возвращает задание, которое завершается при вводе семафора, так что я думаю сразу?Затем мы нажимаем await GetLengthAsync (), который возвращает нас обратно в цикл сообщений wpf.Если предположить, что прошло 10 секунд, и кнопка снова нажата, то мы бы снова ввели метод Button_Click и нажали WaitAsync (), которая возвращает задачу, которая завершается, когда мы входим в семафор, и мы не можем войти в семафор, поэтому мы возвращаемся назад кцикл сообщений?вот как это работает?
ОСНОВНОЙ ВОПРОС - Оба раза мы нажимаем WaitAsync (), мы находимся в одном потоке, и наш семафор ограничивает параллелизм, чтобы позволить только одному потоку одновременно выполнять этот блок кода, ноэто не позволит нашему потоку также ввести этот код?Семафор, очевидно, не может быть получен, скажем, некоторыми другими потоками, такими как thread4 или thread5, но он также не может быть получен даже тем же самым потоком снова?Любое разъяснение будет с благодарностью.
private SemaphoreSlim semaphoreSlim = new SemaphoreSlim(1,1);
public async void Button_Click(object sender, EventArgs args)
{
await semaphoreSlim.WaitAsync();
try
{
// GetLengthAsync takes 40 seconds to complete
int length = await GetLengthAsync();
// LongComputeFunc takes 30 seconds to complete
int aggregate = LongComputeFunc(length);
}
finally
{
semaphoreSlim.Release();
}
}