protected override async Task BroadCastAction(CancellationToken token) { try { foreach (var interval in _intervals) { await Task.Delay(TimeSpan.FromSeconds(interval), token); var message = new OnlineMessage(SuperDriveCore.LocalDevice); var bytes = message.ToPacket().ToBytes(); if (token.IsCancellationRequested) { break; } Env.Logger.Log("+++Broadcast out" + message, nameof(LanDiscoverer)); SendUdp(bytes, _broadcastEndpoint); } } catch (Exception e) { Env.Logger.Log("Broadcast exception", stackTrace: e.StackTrace); } //直接运行可能死锁。 #pragma warning disable 4014 // ReSharper disable once MethodSupportsCancellation Task.Run(() => StopBroadcasting()); #pragma warning restore 4014 }
private void BroadcastTimer_Elapsed(object sender, ElapsedEventArgs e) { var idx = broadCastCount >= intervals.Length ? intervals.Length - 1 : broadCastCount; if (broadCastCount++ > MAX_BROADCAST_TIME) //有限次数广播。如果是无限次数的,当broadcastCount>设定值,idx = intervals.Length-1 { broadcastTimer.Stop(); } else { var message = new OnlineMessage(localInfo); var bytes = message.ToPacket().ToBytes(); udp.Send(null, bytes, udp.broadcastEndpoint); var interval = intervals[idx]; broadcastTimer.Interval = interval; broadcastTimer.Start(); } }