Nano Hash - криптовалюты, майнинг, программирование

Синхронизировать вызов, который либо вызывается (через диспетчер), либо вызывается напрямую

Да, сейчас я программирую что-то для графического интерфейса. Однако я столкнулся с проблемой синхронизации, которую не могу решить самостоятельно.

Я запускаю/останавливаю воспроизведение видео удаленно через UDP. Входящий код/команда анализируется и затем выполняется в классе «Окно».

Поскольку это элемент GUI, любые вызовы, идущие к элементу, должны выполняться в потоке, из которого он был создан. Хотя мой UDP-клиент запускается в собственном потоке. Таким образом, любые вызовы должны проходить через метод Dispatcher.Invoke.

Однако это работает нормально. Есть несколько проблем с этим. Например, метод «загрузить» и метод «воспроизвести» могут выполняться непосредственно друг за другом. Это может привести к тому, что метод «play» будет выполнен перед методом «load». Потому что я не могу контролировать, когда действие вызывается для указанного объекта.

Поэтому я подумал, что буду использовать монитор/мьютекс/семафор/блокировку() для объекта, а затем буду ждать, пока он снова не будет выпущен. См. ниже фрагменты кода. Но это вызывает исключение:

SynchronizationLockException создается путем вызова методов Exit, Pulse, PulseAll и Wait класса Monitor из несинхронизированного блока кода.

Поэтому я ищу лучший/работающий способ синхронизации обоих потоков. Что, если вызов вызывается через диспетчер, другой поток в основном будет ждать, пока вызываемый метод не завершит вызов.

Кроме того, извините мою формулировку, если я использую неправильные термины.

Способ отправки:

#region ExecuteDispatch Members
public void Dispatch(Callback call)
{
    Dispatch(this, call);
}
public void Dispatch(DispatcherObject o, Callback call)
{
    if (!o.Dispatcher.CheckAccess())
    {
        o.Dispatcher.Invoke(
            System.Windows.Threading.DispatcherPriority.Send,
            new Action(call)
        );
    }
    else
    {
        call();
    }
}
#endregion

Метод, который должен быть «синхронизирован»:

Monitor.Enter(player);
Dispatch(delegate()
{
    player.Stop();
    Monitor.Exit(player);
});
Monitor.Enter(player);
Monitor.Exit(player);
27.07.2011

Ответы:


1

Один из возможных способов — заставить один поток сигнализировать другому, что он закончил свою работу. Поэтому вы можете использовать AutoResetEvent или ManualResetEvent:

AutoResetEvent evt = new AutoResetEvent(false);

Dispatch(delegate()
{
    player.Stop();
    evt.Set();
});

evt.WaitOne(); //Here the thread waits until Set is called on evt
27.07.2011
  • Кажется, это делает то, что мне нужно. Я подожду немного дольше, пока не появятся другие ответы, иначе этот будет принят. 27.07.2011
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..