Callback'и вызываются в новом потоке или том же?

139
29 мая 2019, 17:30

Если я правильно понимаю, то в том же.

Однако, каким образом Callback на Timer вызывается в потоке из пула потоков?

The method specified for callback should be reentrant, because it is called on ThreadPool threads. The method can be executed simultaneously on two thread pool threads if the timer interval is less than the time required to execute the method, or if all thread pool threads are in use and the method is queued multiple times.

Вроде, в исходниках не вижу явного создания нового потока...

Answer 1
    [System.Security.SecurityCritical]
    [ResourceExposure(ResourceScope.None)]
    [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
    [SuppressUnmanagedCodeSecurity]
    static extern bool ChangeAppDomainTimer(AppDomainTimerSafeHandle handle, uint dueTime);
    [System.Security.SecurityCritical]
    [ResourceExposure(ResourceScope.None)]
    [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
    [SuppressUnmanagedCodeSecurity]
    [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
    static extern bool DeleteAppDomainTimer(IntPtr handle);

В действительности, ваш коллбек вызывается сервисами CLR, которые используют потоки из пула. Из прототипов методов для создани таймера, видно, что потоки не сознаются в managed коде.ref

Answer 2

Функция CallCallback уже выполняется в пуле потоков, надо смотреть кто ее вызывает. А вызвана она может быть двумя способами.

Первый вариант - из метода FireQueuedTimerCompletion, которая передается в пул потоков методом QueueTimerCompletion

Второй вариант - из метода AppDomainTimerCallback. В исходниках coreclr видно, что он передается в пул потоков методом ThreadpoolMgr::FireTimers

READ ALSO
epplus c# цена деления на графике

epplus c# цена деления на графике

Всем доброго времени сутокСоздаю Excel файл с помощью epplus добаляю в него линейный (eChartType

156
Работа с КриптоПро на .Net Core

Работа с КриптоПро на .Net Core

Цель - подписать xml файл посредством КриптоПроПишу в net core

124
Присвоение TextBlock данных из сокета. SocketIODotNet C#

Присвоение TextBlock данных из сокета. SocketIODotNet C#

Я пишу программу используя SocketIODotNetХочу TextBlock присвоить переданное значение из сокета

151
Необработанное исключение типа “System.AccessViolationException” в mscorlib.dll

Необработанное исключение типа “System.AccessViolationException” в mscorlib.dll

Возвращаясь к проблеме данного кода Глобальный хук клавишОказалось он работает, НО только при установке Цели платформы х32

142