in src/main/csharp/Transport/InactivityMonitor.cs [289:376]
private void StartMonitorThreads()
{
lock(monitor)
{
if(this.IsDisposed || this.disposing)
{
return;
}
if(monitorStarted.Value)
{
return;
}
if(localWireFormatInfo == null)
{
return;
}
if(remoteWireFormatInfo == null)
{
return;
}
if(localWireFormatInfo.MaxInactivityDuration != 0 &&
remoteWireFormatInfo.WriteCheckInterval != 0)
{
readCheckTime =
Math.Max(
localWireFormatInfo.ReadCheckInterval,
remoteWireFormatInfo.WriteCheckInterval);
this.asyncErrorTask = new AsyncSignalReadErrorkTask(this, next.RemoteAddress);
}
if(localWireFormatInfo.MaxInactivityDuration != 0)
{
if(remoteWireFormatInfo.Version > 1.0)
{
writeCheckTime =
Math.Max(localWireFormatInfo.WriteCheckInterval,
remoteWireFormatInfo.ReadCheckInterval);
}
else
{
writeCheckTime = localWireFormatInfo.WriteCheckInterval;
}
this.asyncWriteTask = new AsyncWriteTask(this);
}
initialDelayTime = localWireFormatInfo.MaxInactivityDurationInitialDelay > 0 ?
localWireFormatInfo.MaxInactivityDurationInitialDelay : writeCheckTime;
Tracer.DebugFormat("InactivityMonitor[{0}]: Read Check time interval: {1}",
instanceId, readCheckTime );
Tracer.DebugFormat("InactivityMonitor[{0}]: Initial Delay time interval: {1}",
instanceId, initialDelayTime );
this.asyncTasks = new CompositeTaskRunner();
if(this.asyncErrorTask != null)
{
Tracer.DebugFormat("InactivityMonitor[{0}]: Adding the Async Read Check Task to the Runner.", instanceId);
this.asyncTasks.AddTask(this.asyncErrorTask);
}
if(this.asyncWriteTask != null)
{
Tracer.DebugFormat("InactivityMonitor[{0}]: Write Check time interval: {1}",
instanceId, writeCheckTime );
this.asyncTasks.AddTask(this.asyncWriteTask);
}
if(this.asyncErrorTask != null || this.asyncWriteTask != null)
{
Tracer.DebugFormat("InactivityMonitor[{0}]: Starting the Monitor Timer.", instanceId);
monitorStarted.Value = true;
this.connectionCheckTimer = new Timer(
new TimerCallback(CheckConnection),
null,
initialDelayTime,
writeCheckTime
);
}
}
}