Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/19: Рейтинг темы: голосов - 19, средняя оценка - 4.68
3 / 3 / 7
Регистрация: 19.10.2009
Сообщений: 225

Как в C# сделать синхронизированный метод?

06.05.2011, 13:53. Показов 3889. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть у меня метод, который вызывается при возникновении определенного события. События могут следовать с коротким интервалом времени между ними, тогда как обработчику при наличии большого количества данных может потребоваться время для обработки большее, чем интервал между возникновениями событий.
Наилучшим решением было бы прервать обработку старого события и переключиться на новое. Однако как это реализовать, я себе не представляю. Поэтому мне необходимо сделать так, что пока метод не закончил работу, повторный вызов данного метода ждет, и только после окончания работы предыдущего начинает обработку данных.
Как это сделать?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.05.2011, 13:53
Ответы с готовыми решениями:

Потоки: синхронизированный доступ к стеку
в общем на картинке все нарисовано. Количество потоков нарисовал два, но на самом деле их может быть больше

Синхронизация потоков. Как правильно сделать синхронизированный блок ?
Здравствуйте ! Помогите пожалуйста разобраться. Как правильно организовать синхронизацию внутри метода public void run() ? Дело...

Не синхронизированный ArrayList
Как понимать характеристику ArrauList - не синхронизированный?

5
86 / 62 / 69
Регистрация: 15.03.2007
Сообщений: 6,903
06.05.2011, 15:32
> мне необходимо сделать так, что пока метод не закончил работу,
> повторный вызов данного метода ждет, и только после окончания
> работы предыдущего начинает обработку данных.
Можно синхронизировать работу метода с помощью lock.
Посмотри пример. Думаю из него все понятно.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
using System;
using System.Threading;
 
public class SyncEventHandler
{
    private static object _syncRoot = new object();
 
    public void HandleEvent()
    {
        Console.WriteLine(' HandleEvent Begin');
        lock (_syncRoot)
        {
            Console.WriteLine('     inside lock - begin '+Thread.CurrentThread.Name);
            Thread.Sleep(5000);
            Console.WriteLine('     inside lock - end '+Thread.CurrentThread.Name);
        }
        Console.WriteLine(' HandleEvent End');
    }
}
 
public class ConsoleApp
{
    private static void ThreadBody()
    {
        SyncEventHandler sh = new SyncEventHandler();
        sh.HandleEvent();
    }
 
    public static int Main()
    {
        for (int i=0; i<5; i++)
        {
            Console.WriteLine('Creating thread #'+(i+1));
            Thread t = new Thread(new ThreadStart(ConsoleApp.ThreadBody));
            t.Name = (i+1).ToString();
            t.Start();
            Thread.Sleep(2000);
        }
 
        return 0;
    }
}
0
3 / 3 / 7
Регистрация: 19.10.2009
Сообщений: 225
06.05.2011, 19:23  [ТС]
)
Я уже это сделал. А по другому нельзя?
0
86 / 62 / 69
Регистрация: 15.03.2007
Сообщений: 6,903
08.05.2011, 10:41
Я другого способа не знаю. А чем тебя этот не устраивает?
0
86 / 62 / 69
Регистрация: 15.03.2007
Сообщений: 6,903
18.05.2011, 12:19
Оказывается есть еще один способ. С помощью атрибута MethodImpl
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
using System;
using System.Runtime.CompilerServices; // MethodImpl
using System.Threading;
 
public class SyncEventHandler
{
    [MethodImpl(MethodImplOptions.Synchronized)]
    public static void HandleEvent()
    {
        Console.WriteLine(' HandleEvent Begin - '+Thread.CurrentThread.Name);
        Thread.Sleep(5000);
        Console.WriteLine(' HandleEvent End - '+Thread.CurrentThread.Name);
    }
}
 
public class ConsoleApp
{
    private static void ThreadBody()
    {
        SyncEventHandler.HandleEvent();
    }
 
    public static int Main()
    {
        for (int i=0; i<5; i++)
        {
            Console.WriteLine('Creating thread #'+(i+1));
            Thread t = new Thread(new ThreadStart(ConsoleApp.ThreadBody));
            t.Name = (i+1).ToString();
            t.Start();
            Thread.Sleep(1200);
        }
        return 0;
    }
}
0
3 / 3 / 7
Регистрация: 19.10.2009
Сообщений: 225
19.05.2011, 13:09  [ТС]
Спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.05.2011, 13:09
Помогаю со студенческими работами здесь

Синхронизированный доступ к списку
Документацию не учили читать? ...

Синхронизированный таймер для любого браузера
примеров таймера много и все они по одному принципу сделаны, и все же бывает расхождение с реальным временем при его длительном...

Как сделать метод update() как в игровых движках?
Как сделать метод update() как в игровых движках?

Как сделать метод публичным?
Вот у меня есть код. Не обращайте внимания на странные названия, это я чтобы не запутаться. class Program { ...

Как сделать метод асинхронным?
Имеется метод в классе, я хочу чтобы при его вызове этот метод выполнялся как бы в своем потоке, не блокируя &quot;вызывающий поток&quot;....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru