2016-06-06 5 views
1

Элементы пользовательского интерфейса могут подписываться на события, такие как нажатие, удержание или выпуск. Поэтому я создал объектную переменную для хранения тех информационныхИзменения подписки на события - InvalidOperationException

 private Dictionary<TouchListenerType, List<Action<int, float, Vector2>>> touchData = new Dictionary<TouchListenerType, List<Action<int, float, Vector2>>>(); 

Каждый цикл обновления я итерации по каждой предоставленной вход и делегировать его абонентам.

 try 
     { 
      for (int currentTouchIndex = touchCollections.Count - 1; currentTouchIndex >= 0; currentTouchIndex--) 
      { 
       Vector2 position = MapInput(touchCollections[currentTouchIndex].Position); 
       if (touchCollections[currentTouchIndex].State == TouchLocationState.Moved && 
        touchData[TouchListenerType.Move].Count > 0) 
        touchData[TouchListenerType.Move].ForEach(d => d.Invoke(touchCollections[currentTouchIndex].Id, touchCollections[currentTouchIndex].Pressure, position)); 
       else if (touchCollections[currentTouchIndex].State == TouchLocationState.Pressed && 
        touchData[TouchListenerType.Press].Count > 0) 
        touchData[TouchListenerType.Press].ForEach(d => d.Invoke(touchCollections[currentTouchIndex].Id, touchCollections[currentTouchIndex].Pressure, position)); 
       else if (touchCollections[currentTouchIndex].State == TouchLocationState.Released && 
        touchData[TouchListenerType.Release].Count > 0) 
        touchData[TouchListenerType.Release].ForEach(d => d.Invoke(touchCollections[currentTouchIndex].Id, touchCollections[currentTouchIndex].Pressure, position)); 
      } 
     } catch { } //Enumeration could have been changed 

Если абонент решает отказаться от подписки или добавить еще одну подписку на основе предоставленного ввода, исключение System.InvalidOperationException будет отброшена, поскольку количество подписчиков событие было изменено. До сих пор я просто поставил попытку вокруг блока. Но я хотел бы избежать первоначальной проблемы.

Основываясь на том, что каждый абонент может отказаться от подписки/подписаться в делегате, я не могу работать с семафорами. Также я хотел бы избежать создания копии события в каждом цикле обновлений, поскольку это приложение работает на мобильных устройствах. Как я могу решить эту проблему?

ответ

1

Возможно, достаточно Concurrent Dictionary?

Возможно, вам также понадобится реализовать Custom Event Accessors.

Edit:

Ошибка генерируется заявление, в котором изменяется сбор во время итерации. Для этого необходимо использовать цикл for.

+0

Замок - это уравнение монитора. Но, возможно, я должен использовать события вместо действий. –

+1

Вы получаете сообщение об ошибке во время списка . FOREach? Возможно, вы должны изменить его на цикл 'for', чтобы его размер мог измениться во время итерации. –

+0

Почему я не подумал об этом. Ofc. thats решение .... Спасибо –

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

  • Нет связанных вопросов^_^