powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Вопрос по событиям
10 сообщений из 35, страница 2 из 2
Вопрос по событиям
    #39400475
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

ну х.з., как то, лет 10 назад, мой друг накропал код выстреливать обработчик события в отдельный поток каждому подписчику - он очень удивился высокой производительности (а я нет - всегда верил мокрософтам)
...
Рейтинг: 0 / 0
Вопрос по событиям
    #39400568
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LR,

угу, для этого надо раскалупать цепочку делегатов. с асинками ещё интереснее. всё решаемо, но надо отдать должное, для своего времени было норм, сейчас проще использовать что-то своё. хотя бы, чтобы не писать всякие расширения, типа SafeEventInvoker, SafeEventInvokerAsync...
...
Рейтинг: 0 / 0
Вопрос по событиям
    #39400701
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttЕвгенийВА если соорудить простенький код с событием и попробовать дизассемблировать его, только не убогими поделками от телерика и джетбрайнса?

Убогие? Что же тогда называть богом данные поделки?

Таки что ты хочешь сказать?
На самом деле компилятор сварганит нечто подобное.
Код: 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.
84.
85.
86.
87.
.event class [mscorlib]System.EventHandler`1<class JsonRSM.Program/A/MyEventArgs> MyEvent
{
	.addon instance void JsonRSM.Program/A::add_MyEvent(class [mscorlib]System.EventHandler`1<class JsonRSM.Program/A/MyEventArgs>)
	.removeon instance void JsonRSM.Program/A::remove_MyEvent(class [mscorlib]System.EventHandler`1<class JsonRSM.Program/A/MyEventArgs>)
}

.method public hidebysig specialname 
	instance void add_MyEvent (
		class [mscorlib]System.EventHandler`1<class JsonRSM.Program/A/MyEventArgs> 'value'
	) cil managed 
{
	.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
		01 00 00 00
	)
	// Method begins at RVA 0x4134
	// Code size 41 (0x29)
	.maxstack 3
	.locals init (
		[0] class [mscorlib]System.EventHandler`1<class JsonRSM.Program/A/MyEventArgs>,
		[1] class [mscorlib]System.EventHandler`1<class JsonRSM.Program/A/MyEventArgs>,
		[2] class [mscorlib]System.EventHandler`1<class JsonRSM.Program/A/MyEventArgs>
	)

	IL_0000: ldarg.0
	IL_0001: ldfld class [mscorlib]System.EventHandler`1<class JsonRSM.Program/A/MyEventArgs> JsonRSM.Program/A::MyEvent
	IL_0006: stloc.0
	// loop start (head: IL_0007)
		IL_0007: ldloc.0
		IL_0008: stloc.1
		IL_0009: ldloc.1
		IL_000a: ldarg.1
		IL_000b: call class [mscorlib]System.Delegate [mscorlib]System.Delegate::Combine(class [mscorlib]System.Delegate, class [mscorlib]System.Delegate)
		IL_0010: castclass class [mscorlib]System.EventHandler`1<class JsonRSM.Program/A/MyEventArgs>
		IL_0015: stloc.2
		IL_0016: ldarg.0
		IL_0017: ldflda class [mscorlib]System.EventHandler`1<class JsonRSM.Program/A/MyEventArgs> JsonRSM.Program/A::MyEvent
		IL_001c: ldloc.2
		IL_001d: ldloc.1
		IL_001e: call !!0 [mscorlib]System.Threading.Interlocked::CompareExchange<class [mscorlib]System.EventHandler`1<class JsonRSM.Program/A/MyEventArgs>>(!!0&, !!0, !!0)
		IL_0023: stloc.0
		IL_0024: ldloc.0
		IL_0025: ldloc.1
		IL_0026: bne.un.s IL_0007
	// end loop
	IL_0028: ret
} // end of method A::add_MyEvent

.method public hidebysig specialname 
	instance void remove_MyEvent (
		class [mscorlib]System.EventHandler`1<class JsonRSM.Program/A/MyEventArgs> 'value'
	) cil managed 
{
	.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
		01 00 00 00
	)
	// Method begins at RVA 0x416c
	// Code size 41 (0x29)
	.maxstack 3
	.locals init (
		[0] class [mscorlib]System.EventHandler`1<class JsonRSM.Program/A/MyEventArgs>,
		[1] class [mscorlib]System.EventHandler`1<class JsonRSM.Program/A/MyEventArgs>,
		[2] class [mscorlib]System.EventHandler`1<class JsonRSM.Program/A/MyEventArgs>
	)

	IL_0000: ldarg.0
	IL_0001: ldfld class [mscorlib]System.EventHandler`1<class JsonRSM.Program/A/MyEventArgs> JsonRSM.Program/A::MyEvent
	IL_0006: stloc.0
	// loop start (head: IL_0007)
		IL_0007: ldloc.0
		IL_0008: stloc.1
		IL_0009: ldloc.1
		IL_000a: ldarg.1
		IL_000b: call class [mscorlib]System.Delegate [mscorlib]System.Delegate::Remove(class [mscorlib]System.Delegate, class [mscorlib]System.Delegate)
		IL_0010: castclass class [mscorlib]System.EventHandler`1<class JsonRSM.Program/A/MyEventArgs>
		IL_0015: stloc.2
		IL_0016: ldarg.0
		IL_0017: ldflda class [mscorlib]System.EventHandler`1<class JsonRSM.Program/A/MyEventArgs> JsonRSM.Program/A::MyEvent
		IL_001c: ldloc.2
		IL_001d: ldloc.1
		IL_001e: call !!0 [mscorlib]System.Threading.Interlocked::CompareExchange<class [mscorlib]System.EventHandler`1<class JsonRSM.Program/A/MyEventArgs>>(!!0&, !!0, !!0)
		IL_0023: stloc.0
		IL_0024: ldloc.0
		IL_0025: ldloc.1
		IL_0026: bne.un.s IL_0007
	// end loop
	IL_0028: ret
} // end of method A::remove_MyEvent


Для многопоточной среды самый то.
...
Рейтинг: 0 / 0
Вопрос по событиям
    #39400725
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВ,

А наезды на JetBrains и Telerik были к чему?


ЕвгенийВНа самом деле компилятор сварганит нечто подобное.

Не вижу у тебя вызова события.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
namespace TestProject
{
    public class TestC
    {
        public event EventHandler MyEvent;

        protected void OnMyEvent(EventArgs a)
        {
            MyEvent?.Invoke(this, a);
        }

    }
}



IL:

Код: 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.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
.class public auto ansi beforefieldinit 
  TestProject.TestC
    extends [mscorlib]System.Object
{

  .field private class [mscorlib]System.EventHandler MyEvent
  .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() 
    = (01 00 00 00 )
  .custom instance void [mscorlib]System.Diagnostics.DebuggerBrowsableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggerBrowsableState) 
    = (01 00 00 00 00 00 00 00 ) // ........
    // int32(0) // 0x00000000

  .method public hidebysig specialname instance void 
    add_MyEvent(
      class [mscorlib]System.EventHandler 'value'
    ) cil managed 
  {
    .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() 
      = (01 00 00 00 )
    .maxstack 3
    .locals init (
      [0] class [mscorlib]System.EventHandler V_0,
      [1] class [mscorlib]System.EventHandler V_1,
      [2] class [mscorlib]System.EventHandler V_2
    )

    IL_0000: ldarg.0      // this
    IL_0001: ldfld        class [mscorlib]System.EventHandler TestProject.TestC::MyEvent
    IL_0006: stloc.0      // V_0
    // start of loop, entry point: IL_0007
      IL_0007: ldloc.0      // V_0
      IL_0008: stloc.1      // V_1
      IL_0009: ldloc.1      // V_1
      IL_000a: ldarg.1      // 'value'
      IL_000b: call         class [mscorlib]System.Delegate [mscorlib]System.Delegate::Combine(class [mscorlib]System.Delegate, class [mscorlib]System.Delegate)
      IL_0010: castclass    [mscorlib]System.EventHandler
      IL_0015: stloc.2      // V_2
      IL_0016: ldarg.0      // this
      IL_0017: ldflda       class [mscorlib]System.EventHandler TestProject.TestC::MyEvent
      IL_001c: ldloc.2      // V_2
      IL_001d: ldloc.1      // V_1
      IL_001e: call         !!0/*class [mscorlib]System.EventHandler*/ [mscorlib]System.Threading.Interlocked::CompareExchange<class [mscorlib]System.EventHandler>(!!0/*class [mscorlib]System.EventHandler*/&, !!0/*class [mscorlib]System.EventHandler*/, !!0/*class [mscorlib]System.EventHandler*/)
      IL_0023: stloc.0      // V_0
      IL_0024: ldloc.0      // V_0
      IL_0025: ldloc.1      // V_1
      IL_0026: bne.un.s     IL_0007
    // end of loop
    IL_0028: ret          

  } // end of method TestC::add_MyEvent

  .method public hidebysig specialname instance void 
    remove_MyEvent(
      class [mscorlib]System.EventHandler 'value'
    ) cil managed 
  {
    .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() 
      = (01 00 00 00 )
    .maxstack 3
    .locals init (
      [0] class [mscorlib]System.EventHandler V_0,
      [1] class [mscorlib]System.EventHandler V_1,
      [2] class [mscorlib]System.EventHandler V_2
    )

    IL_0000: ldarg.0      // this
    IL_0001: ldfld        class [mscorlib]System.EventHandler TestProject.TestC::MyEvent
    IL_0006: stloc.0      // V_0
    // start of loop, entry point: IL_0007
      IL_0007: ldloc.0      // V_0
      IL_0008: stloc.1      // V_1
      IL_0009: ldloc.1      // V_1
      IL_000a: ldarg.1      // 'value'
      IL_000b: call         class [mscorlib]System.Delegate [mscorlib]System.Delegate::Remove(class [mscorlib]System.Delegate, class [mscorlib]System.Delegate)
      IL_0010: castclass    [mscorlib]System.EventHandler
      IL_0015: stloc.2      // V_2
      IL_0016: ldarg.0      // this
      IL_0017: ldflda       class [mscorlib]System.EventHandler TestProject.TestC::MyEvent
      IL_001c: ldloc.2      // V_2
      IL_001d: ldloc.1      // V_1
      IL_001e: call         !!0/*class [mscorlib]System.EventHandler*/ [mscorlib]System.Threading.Interlocked::CompareExchange<class [mscorlib]System.EventHandler>(!!0/*class [mscorlib]System.EventHandler*/&, !!0/*class [mscorlib]System.EventHandler*/, !!0/*class [mscorlib]System.EventHandler*/)
      IL_0023: stloc.0      // V_0
      IL_0024: ldloc.0      // V_0
      IL_0025: ldloc.1      // V_1
      IL_0026: bne.un.s     IL_0007
    // end of loop
    IL_0028: ret          

  } // end of method TestC::remove_MyEvent

  .method family hidebysig instance void 
    OnMyEvent(
      class [mscorlib]System.EventArgs a
    ) cil managed 
  {
    .maxstack 8

    // [13 9 - 13 10]
    IL_0000: nop          

    // [14 13 - 14 38]
    IL_0001: ldarg.0      // this
    IL_0002: ldfld        class [mscorlib]System.EventHandler TestProject.TestC::MyEvent
    IL_0007: dup          
    IL_0008: brtrue.s     IL_000d
    IL_000a: pop          
    IL_000b: br.s         IL_0015
    IL_000d: ldarg.0      // this
    IL_000e: ldarg.1      // a
    IL_000f: callvirt     instance void [mscorlib]System.EventHandler::Invoke(object, class [mscorlib]System.EventArgs)
    IL_0014: nop          

    // [15 9 - 15 10]
    IL_0015: ret          

  } // end of method TestC::OnMyEvent

  .method public hidebysig specialname rtspecialname instance void 
    .ctor() cil managed 
  {
    .maxstack 8

    IL_0000: ldarg.0      // this
    IL_0001: call         instance void [mscorlib]System.Object::.ctor()
    IL_0006: nop          
    IL_0007: ret          

  } // end of method TestC::.ctor

  .event [mscorlib]System.EventHandler MyEvent
  {
    .addon instance void TestProject.TestC::add_MyEvent(class [mscorlib]System.EventHandler) 
    .removeon instance void TestProject.TestC::remove_MyEvent(class [mscorlib]System.EventHandler) 
  } // end of event TestC::MyEvent
} // end of class TestProject.TestC



Как видим, если использовать вызов через ?., то CompareExchange не нужен, и оптимизация компилятора ничего не уберёт.
...
Рейтинг: 0 / 0
Вопрос по событиям
    #39400727
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, IL получен через dotPeek
...
Рейтинг: 0 / 0
Вопрос по событиям
    #39401138
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,
Таки с потокобезопасностью то все нормально, насколько это возможно?
...
Рейтинг: 0 / 0
Вопрос по событиям
    #39401239
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВhVostt,
Таки с потокобезопасностью то все нормально, насколько это возможно?

Учитывая, что event это всего лишь абстракция, могли бы реализовать потокобезопасный Invoke. Странно, что этого не сделали. Ещё не нравится реализация цепочек делегатов.
...
Рейтинг: 0 / 0
Вопрос по событиям
    #39401291
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,
Цепочка делегатов есть неизменяемая субстанция, самый то для многопоточности!
...
Рейтинг: 0 / 0
Вопрос по событиям
    #39401312
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВhVostt,
Цепочка делегатов есть неизменяемая субстанция, самый то для многопоточности!

Да ни для чего это не самое то, кроме как для событий. В большинстве случаев лишний и не очевидный оверхед.
...
Рейтинг: 0 / 0
Вопрос по событиям
    #39401478
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надеялся что jit оптимизирует, но :(
Код: c#
1.
2.
3.
Action<string> ass = (s) => Console.WriteLine(s);
            ass("test");
            Console.WriteLine("test");


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
            ass("test");
00352D67  mov         edx,dword ptr ds:[2FB232Ch]  
00352D6D  mov         ecx,dword ptr [ebp-40h]  
00352D70  mov         eax,dword ptr [ecx+0Ch]  
00352D73  mov         ecx,dword ptr [ecx+4]  
00352D76  call        eax  
00352D78  nop  
            Console.WriteLine("test");
00352D79  mov         ecx,dword ptr ds:[2FB232Ch]  
00352D7F  call        72D46640  
00352D84  nop 
...
Рейтинг: 0 / 0
10 сообщений из 35, страница 2 из 2
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Вопрос по событиям
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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