Windows服务中的连续异步Ping

问题描述 投票:0回答:1

我需要连续监视主机列表。 N秒后,我需要再次检查列表。因此,我尝试在Windows服务中使用异步ping。

我尝试遵循与该主题相关的其他帖子中的技巧,但是始终在启动后不久我的服务就会停止。

“ OnElapsedTime”功能中的等待问题。

任何人都知道哪里出了什么问题?波纹管我的代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks;
using System.Timers;
using System.Net.NetworkInformation;

namespace PingAsyncService
{
    public partial class HyBrazil_Ping : ServiceBase

    {

        Timer timer = new Timer();
        List<string> IPList = new List<string>();  //List of IPs


        public HyBrazil_Ping()
        {
            IPList.Add("192.168.0.1");
            IPList.Add("192.168.0.254");

            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {

            WriteToFile("Service is started at " + DateTime.Now);
            timer.Elapsed += new ElapsedEventHandler(OnElapsedTime);
            timer.Interval = 5000; //number in miliseconds 
            timer.Enabled = true;
        }

        protected override void OnStop()
        {
            WriteToFile("Service is stopped at " + DateTime.Now);
        }

        private async void OnElapsedTime(object source, ElapsedEventArgs e)
        {
            //WriteToFile("Service is recall at " + DateTime.Now);

            var ResultList = await PingAsync();
            foreach(PingReply reply in ResultList)
            {
                WriteToFile(reply.Address.ToString() + ";" + reply.Status.ToString());
            }
        }

        private async Task<PingReply> PingAndProcessAsync(Ping pingSender, string ip)
        {
            var result = await pingSender.SendPingAsync(ip, 2000);
            return result;
        }

        private async Task<List<PingReply>> PingAsync()
        {
            Ping pingSender = new Ping();
            var tasks = IPList.Select(ip => PingAndProcessAsync(pingSender, ip));
            var results = await Task.WhenAll(tasks);
            return results.ToList();
        }

        public void WriteToFile(string Message)
        {
            string path = AppDomain.CurrentDomain.BaseDirectory + "\\Logs";
            if (!Directory.Exists(path))
            {
                Directory.CreateDirectory(path);
            }
            string filepath = AppDomain.CurrentDomain.BaseDirectory + "\\Logs\\ServiceLog_" + DateTime.Now.Date.ToShortDateString().Replace('/', '_') + ".txt";
            if (!File.Exists(filepath))
            {
                // Create a file to write to.   
                using (StreamWriter sw = File.CreateText(filepath))
                {
                    sw.WriteLine(Message);
                }
            }
            else
            {
                using (StreamWriter sw = File.AppendText(filepath))
                {
                    sw.WriteLine(Message);
                }
            }
        }
    }
}

非常感谢!

c# service async-await windows-services ping
1个回答
2
投票

在其中一条注释中,您提到的错误消息为“异步调用已在进行中。必须先完成或取消它,然后才能调用此方法。”

可能是,Ping对象不允许同时进行异步调用。每次调用每次都使用一个新的Ping对象可能会有所帮助。

private async Task<List<PingReply>> PingAsync()
{
    // Ping pingSender = new Ping();
    var tasks = IPList.Select(ip =>
    {
        using (var p= new Ping())
        {
            return PingAndProcessAsync(p, ip);
        }
    });
    var results = await Task.WhenAll(tasks);
    return results.ToList();
}
© www.soinside.com 2019 - 2024. All rights reserved.