Здравствуйте, LWhisper, Вы писали:
LW>Всем привет!
LW>При работе с сетевыми интерфейсами, например, посредством TcpListener, при помощи старых добрых Begin/End AcceptTcpClient, формируется довольно подозрительный стек:
LW>LW>System.Threading.WaitHandle.InternalWaitOne(System.Runtime.InteropServices.SafeHandle, Int64, Boolean, Boolean)
LW>System.Threading.WaitHandle.WaitOne(Int32, Boolean)
LW>MyListener..OnAcceptConnection(System.IAsyncResult)
LW>System.Net.LazyAsyncResult.Complete(IntPtr)
LW>System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
LW>System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
LW>System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
LW>System.Net.ContextAwareResult.Complete(IntPtr)
LW>System.Net.LazyAsyncResult.ProtectedInvokeCallback(System.Object, IntPtr)
LW>System.Net.Sockets.BaseOverlappedAsyncResult.CompletionPortCallback(UInt32, UInt32, System.Threading.NativeOverlapped*)
LW>System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32, UInt32, System.Threading.NativeOverlapped*)
LW>GCFrame
LW>DebuggerU2MCatchHandlerFrame
LW>
LW>Смущает именно PerformIOCompletionCallback.
LW>Значит ли это, что весь оставшийся код так же будет выполнен в IOCP-треде, которых в системе не густо, и я смачно выстрелю себе в ногу этим вот WaitOne?
Тут неплохо объясняется -- почитайте все ответы. Вроде пишут, что по мере необходимости среда (runtime-->ОС) будут создавать
еще IOCP потоки, но вообще с любым пульным потоком WaitOne не лучшая идея.
Всем привет!
При работе с сетевыми интерфейсами, например, посредством TcpListener, при помощи старых добрых Begin/End AcceptTcpClient, формируется довольно подозрительный стек:
System.Threading.WaitHandle.InternalWaitOne(System.Runtime.InteropServices.SafeHandle, Int64, Boolean, Boolean)
System.Threading.WaitHandle.WaitOne(Int32, Boolean)
MyListener..OnAcceptConnection(System.IAsyncResult)
System.Net.LazyAsyncResult.Complete(IntPtr)
System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
System.Net.ContextAwareResult.Complete(IntPtr)
System.Net.LazyAsyncResult.ProtectedInvokeCallback(System.Object, IntPtr)
System.Net.Sockets.BaseOverlappedAsyncResult.CompletionPortCallback(UInt32, UInt32, System.Threading.NativeOverlapped*)
System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32, UInt32, System.Threading.NativeOverlapped*)
GCFrame
DebuggerU2MCatchHandlerFrame
Смущает именно PerformIOCompletionCallback.
Значит ли это, что весь оставшийся код так же будет выполнен в IOCP-треде, которых в системе не густо, и я смачно выстрелю себе в ногу этим вот WaitOne?
Здравствуйте, LWhisper, Вы писали:
LW>Смущает именно PerformIOCompletionCallback.
LW>Значит ли это, что весь оставшийся код так же будет выполнен в IOCP-треде, которых в системе не густо, и я смачно выстрелю себе в ногу этим вот WaitOne?
There Is No Thread... << RSDN@Home 1.3.108 alpha 5 rev. 56>>
Здравствуйте, _Raz_, Вы писали:
_R_>There Is No Thread
Ты дал неверный ответ. Я не спрашиваю, как работает IOCP, это понятно. Мой вопрос касается исключительно _IOCompletionCallback в реалиях .NET. И там как раз есть вполне себе живой тред. И у меня лишь вопрос — из какой он группы. Из дефолтного пула, который можно попридержать или из пула, который разгребает IOCP?
Здравствуйте, Sharov, Вы писали:
S>Тут неплохо объясняется -- почитайте все ответы. Вроде пишут, что по мере необходимости среда (runtime-->ОС) будут создавать
S>еще IOCP потоки, но вообще с любым пульным потоком WaitOne не лучшая идея.
Судя по WinDBG, действительно IOCP'ые. В дампе висят 800/800. До лимита не добрались, но каждое создание нового потока занимает время.
Здравствуйте, LWhisper, Вы писали:
LW>Ты дал неверный ответ. Я не спрашиваю, как работает IOCP, это понятно. Мой вопрос касается исключительно _IOCompletionCallback в реалиях .NET. И там как раз есть вполне себе живой тред. И у меня лишь вопрос — из какой он группы. Из дефолтного пула, который можно попридержать или из пула, который разгребает IOCP?
Из независимого пула.
ThreadPool.SetMinThreads позволяет установить minThreads для обоих пулов. То есть чтобы быстро создавались IOCompletion потоки, нужно увеличить второй параметр.