C#, обработчики событий и поточная обработка

Я просто запутался в этой проблеме и решил ее, используя гораздо более простую реализацию, чем другие, описанные здесь. Я просто использую методы, доступные в NSManagedObject для работы с отношениями, когда не использую подклассы.

Пример реализации для вставки сущности в отношение NSOrderedSet будет выглядеть следующим образом:

- (void)addAddress:(Address *)address
{
    if ([self.addresses containsObject:address]) {
        return;
    }
    // Use NSManagedObject's methods for inserting an object
    [[self mutableOrderedSetValueForKey:@"addresses"] addObject:address];
}

Это прекрасно работает, и это то, что я использовал, прежде чем перейти к NSManagedObject подклассам.

8
задан anonymous coward 1 July 2009 в 06:22
поделиться

2 ответа

Есть два варианта:

1) Сделать обработчики событий потокобезопасными: использовать Control.Invoke / BeginInvoke в любом обработчике событий. который должен взаимодействовать с потоком пользовательского интерфейса.

2) Сделайте маршалинг рабочего потока обратно потоку пользовательского интерфейса перед вызовом события - другими словами, используйте Control.Invoke как часть процесса повышения событие, так что все обработчики событий будут вызываться в потоке пользовательского интерфейса. В зависимости от того, как структурировано ваше приложение, вы можете не захотеть, чтобы ваш компонент, генерирующий события, явно знал об интерфейсе пользователя - но когда он создается, вы можете передать ISynchronizeInvoke (который Control реализует), и ваш компонент может использовать это, чтобы вызывать свои события в правильном потоке. Конечно, это работает (во всяком случае, просто), если каждый обработчик событий может работать в одном потоке, но это часто так. Вы могли бы написать что-то вроде:

protected void OnFoo(EventArgs args)
{
    if (sync != null && sync.InvokeRequired)
    {
        sync.Invoke((Action) delegate { OnFoo(args) }, null);
        return;
    }
    EventHandler handler = Foo; // Where Foo is the event name
    if (handler != null)
    {
        handler (this, args);
    }
}
11
ответ дан 5 December 2019 в 10:04
поделиться

Если вы запускаете свое событие в коде, который выполняется вашим рабочим потоком, то все методы, подписанные на событие, будут выполняться в этом рабочем потоке.

Для элементов GUI вам необходимо посмотрите на Invoke-методы.

С уважением

6
ответ дан 5 December 2019 в 10:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: