示例#1
0
        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();
            }
        }