powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Удаление подписчиков
12 сообщений из 12, страница 1 из 1
Удаление подписчиков
    #39179525
ЧитательX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Возможно где-то в большой куче про делегаты есть ответ, но что-то не нашел то, что мне нужно.
Есть событие
Код: c#
1.
public event dRefresh OnRefresh;


На это событие может подписаться произвольное число подписчиков.
Код: c#
1.
OnRefresh+=...  OnRefresh+=...


В какой-то момент мне нужно сбросить все эти подписки.
Как это сделать?
...
Рейтинг: 0 / 0
Удаление подписчиков
    #39179538
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Удаление подписчиков
    #39179544
ЧитательX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо.
...
Рейтинг: 0 / 0
Удаление подписчиков
    #39179640
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЧитательX,
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
   public static event EventHandler<EventArgs> myEvent;
     
        static void Main()
        {
            var i = 0;
            EventHandler<EventArgs> eh = (o, a) => Console.WriteLine(i++);
            Enumerable.Range(1, 100).ToList().ForEach(x => myEvent += eh);
            myEvent?.Invoke(null, EventArgs.Empty);
            myEvent.GetInvocationList().ToList().ForEach(d => myEvent -= (EventHandler<EventArgs>)d);
            myEvent?.Invoke(null, EventArgs.Empty);
            Console.ReadLine();

        }
...
Рейтинг: 0 / 0
Удаление подписчиков
    #39179714
Ilya81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныЕсть тут: https://www.google.ru/search?q=c# clear all event subscribers
первая ссылка в выдаче: http://stackoverflow.com/questions/91778/how-to-remove-all-event-handlers-from-a-control
Не надо так делать, уж лучше реализовать подписку на событие явно (explicitly).
...
Рейтинг: 0 / 0
Удаление подписчиков
    #39179800
pima
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я делала явно:
Код: c#
1.
OnRefresh -= grid_Refresh;


Но это надо перебрать всех подписчиков и отвязать.
...
Рейтинг: 0 / 0
Удаление подписчиков
    #39179897
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ilya81Не надо так делать, уж лучше реализовать подписку на событие явно (explicitly).
Как - так? По ссылке штук 5 разных вариантов отписки.
...
Рейтинг: 0 / 0
Удаление подписчиков
    #39179993
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мне кажется, у автора просто события в модели, а обработка этих событий в представлении или наоборот из-за этого такая жопа, но это конечно только предположение :)
...
Рейтинг: 0 / 0
Удаление подписчиков
    #39180065
Ilya81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я имею в виду вместо:
Код: c#
1.
public event dRefresh OnRefresh;


Использовать что-то вроде:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
EventHandlerList _listeners;

public event dRefresh OnRefresh
{
  add
  {
      _listeners.AddHandler(value);
  }
  remove
  {
      _listeners.RemoveHandler(value);
  }
}


Так хоть без BindingFlags.NonPublic обойдётся.
Хоть
...
Рейтинг: 0 / 0
Удаление подписчиков
    #39180098
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ilya81Я имею в виду вместо:
Код: c#
1.
public event dRefresh OnRefresh;


Использовать что-то вроде:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
EventHandlerList _listeners;

public event dRefresh OnRefresh
{
  add
  {
      _listeners.AddHandler(value);
  }
  remove
  {
      _listeners.RemoveHandler(value);
  }
}


Так хоть без BindingFlags.NonPublic обойдётся.
Хоть
Ну и молодец.
На самом деле в первом случае компилятор сгенерирует что то типа.
Код: 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.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
.event class [mscorlib]System.EventHandler`1<class [mscorlib]System.EventArgs> myEvent
{
	.addon void ConsoleApplication1.Program::add_myEvent(class [mscorlib]System.EventHandler`1<class [mscorlib]System.EventArgs>)
	.removeon void ConsoleApplication1.Program::remove_myEvent(class [mscorlib]System.EventHandler`1<class [mscorlib]System.EventArgs>)
}

.method public hidebysig specialname static 
	void add_myEvent (
		class [mscorlib]System.EventHandler`1<class [mscorlib]System.EventArgs> 'value'
	) cil managed 
{
	.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
		01 00 00 00
	)
	// Method begins at RVA 0xae8c
	// Code size 39 (0x27)
	.maxstack 3
	.locals init (
		[0] class [mscorlib]System.EventHandler`1<class [mscorlib]System.EventArgs>,
		[1] class [mscorlib]System.EventHandler`1<class [mscorlib]System.EventArgs>,
		[2] class [mscorlib]System.EventHandler`1<class [mscorlib]System.EventArgs>
	)

	IL_0000: ldsfld class [mscorlib]System.EventHandler`1<class [mscorlib]System.EventArgs> ConsoleApplication1.Program::myEvent
	IL_0005: stloc.0
	// loop start (head: IL_0006)
		IL_0006: ldloc.0
		IL_0007: stloc.1
		IL_0008: ldloc.1
		IL_0009: ldarg.0
		IL_000a: call class [mscorlib]System.Delegate [mscorlib]System.Delegate::Combine(class [mscorlib]System.Delegate, class [mscorlib]System.Delegate)
		IL_000f: castclass class [mscorlib]System.EventHandler`1<class [mscorlib]System.EventArgs>
		IL_0014: stloc.2
		IL_0015: ldsflda class [mscorlib]System.EventHandler`1<class [mscorlib]System.EventArgs> ConsoleApplication1.Program::myEvent
		IL_001a: ldloc.2
		IL_001b: ldloc.1
		IL_001c: call !!0 [mscorlib]System.Threading.Interlocked::CompareExchange<class [mscorlib]System.EventHandler`1<class [mscorlib]System.EventArgs>>(!!0&, !!0, !!0)
		IL_0021: stloc.0
		IL_0022: ldloc.0
		IL_0023: ldloc.1
		IL_0024: bne.un.s IL_0006
	// end loop
	IL_0026: ret
} // end of method Program::add_myEvent

.method public hidebysig specialname static 
	void remove_myEvent (
		class [mscorlib]System.EventHandler`1<class [mscorlib]System.EventArgs> 'value'
	) cil managed 
{
	.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
		01 00 00 00
	)
	// Method begins at RVA 0xaec0
	// Code size 39 (0x27)
	.maxstack 3
	.locals init (
		[0] class [mscorlib]System.EventHandler`1<class [mscorlib]System.EventArgs>,
		[1] class [mscorlib]System.EventHandler`1<class [mscorlib]System.EventArgs>,
		[2] class [mscorlib]System.EventHandler`1<class [mscorlib]System.EventArgs>
	)

	IL_0000: ldsfld class [mscorlib]System.EventHandler`1<class [mscorlib]System.EventArgs> ConsoleApplication1.Program::myEvent
	IL_0005: stloc.0
	// loop start (head: IL_0006)
		IL_0006: ldloc.0
		IL_0007: stloc.1
		IL_0008: ldloc.1
		IL_0009: ldarg.0
		IL_000a: call class [mscorlib]System.Delegate [mscorlib]System.Delegate::Remove(class [mscorlib]System.Delegate, class [mscorlib]System.Delegate)
		IL_000f: castclass class [mscorlib]System.EventHandler`1<class [mscorlib]System.EventArgs>
		IL_0014: stloc.2
		IL_0015: ldsflda class [mscorlib]System.EventHandler`1<class [mscorlib]System.EventArgs> ConsoleApplication1.Program::myEvent
		IL_001a: ldloc.2
		IL_001b: ldloc.1
		IL_001c: call !!0 [mscorlib]System.Threading.Interlocked::CompareExchange<class [mscorlib]System.EventHandler`1<class [mscorlib]System.EventArgs>>(!!0&, !!0, !!0)
		IL_0021: stloc.0
		IL_0022: ldloc.0
		IL_0023: ldloc.1
		IL_0024: bne.un.s IL_0006
	// end loop
	IL_0026: ret
} // end of method Program::remove_myEvent
...
Рейтинг: 0 / 0
Удаление подписчиков
    #39181510
Ilya81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВ...
На самом деле в первом случае компилятор сгенерирует что то типа.
...
По мне дело не в компиляторе, а в людях, которые будут дорабатывать такой код. И искать, сколько ж строковых констант нужно обновить при том или ином исправлении и где они напутаны, когда что-то уже не срабатывает (а поиск с заданным расстоянием Левенштейна в большинстве IDE отсутствует, придётся вручную).
...
Рейтинг: 0 / 0
Удаление подписчиков
    #39181566
Фотография fortibransa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ilya81ЕвгенийВ...
На самом деле в первом случае компилятор сгенерирует что то типа.
...
По мне дело не в компиляторе, а в людях, которые будут дорабатывать такой код. И искать, сколько ж строковых констант нужно обновить при том или ином исправлении и где они напутаны, когда что-то уже не срабатывает (а поиск с заданным расстоянием Левенштейна в большинстве IDE отсутствует, придётся вручную).+1, даже не в людях, я потом сам "в себе" плохо ориентировался.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Удаление подписчиков
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]