2014-09-30 4 views
0

У меня есть приложение, написанное на C#. У меня есть класс (например, ClassA), который имеет простое событие (код ниже). Событие повышается, чтобы пользователь обновлял ход выполнения кода.многопоточное и поднятие событий

public delegate void MyDelegateProgessUpdate(string value); 
    public event MyDelegateProgessUpdate ProgressUpdate; 

При запуске приложения создается список объектов ClassA (максимум до 8). Таким образом, все 8 объектов будут поднимать событие (в своем классе) - это работает отлично, поскольку я только что его протестировал. Однако мне было интересно, если бы два объекта подняли событие одновременно, если возникнет проблема?

Редактировать

Я хотел бы упомянуть следующие детали. Список объектов ClassA будет работать одновременно, поэтому возможно, что события могут быть подняты одновременно.

Task[] myTasks = new Task[numThreads]; 

for (int i = 0; i < myTasks.Length; i++) 
      myTasks [i] = Task.Factory.StartNew(ClassA[i].DoSomeWork, someData[i]); 

Это все делается на фоне рабочего потока. Когда событие поднимается, свойство в моем WPF-интерфейсе обновляется и вызывается событие OnPropertyChanged.

+0

После редактирования с помощью потоков: Тогда, как я упомянул в своем ответе: Безопасность потоков - это необходимость для методов, и вам также нужно быть очень осторожными, что они делают, и как может быть, что вам нужно использовать invoke, когда вы вызываете методы, ...от других процессов (и что можно вызвать немало проблем ... наткнулся на него снова и снова) – Thomas

ответ

1

Ответ зависит только от кода (ваш код), который выполняется с помощью событий:

Если сам код не threadsave тогда нет нет никакой проблемы. Если код не является 100% -ным потоком, тогда да, у вас есть возможная проблема в ваших руках (должно произойти гоночное состояние).

Сам по себе нет сложной проблемы с несколькими объектами, поднимающими одно и то же событие. Это зависит только от кода самого события, и если у объектов есть права поднять событие. Например, если вы находитесь в своем собственном потоке и попытаться поднять событие на GUI, который работает в своем собственном потоке, то вам нужно использовать взывать иначе вы будете иметь проблемы

То есть, если у вас есть код что приводит к очень быстрым событиям (например, к нескольким обработчикам, установленным для одного события, ....), где ваш пример кода не содержит подробных сведений о том, как поднимаются события (и как вы поднимаете несколько событий)

1

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

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

Edit:

Я не могу комментировать в отношении WPF, так как мой опыт в основном Winforms, однако this answer, как представляется, довольно всеобъемлющим в отношении управления кросс-нить материал в WPF.

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

Смежные вопросы