是的,这是来自家庭作业,但即使是我的教授也不知道为什么它不起作用,所以我来到这里。我们的想法是从一个CSV文件中读取,ping其中的所有URL,并将结果数据放入第二个CSV文件中。问题是代码会循环回到CSV文件中的第一个URL,并在通过第一个URL后开始返回错误消息。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Timers;
using System.IO;
using Microsoft.VisualBasic.FileIO;
using System.Xml.Linq;
using System.Net.NetworkInformation;
namespace Project04
{
class Program
{
static void Main(string[] args)
{
string choice;
//menu
do
{
Console.WriteLine("Select an option:");
Console.WriteLine("A) Start Ping");
Console.WriteLine("B) Stop Ping");
Console.WriteLine("C) Exit");
choice = Console.ReadLine();
switch (choice)
{
case "A":
RunPing();
break;
case "B":
//stop method
//needed?
break;
default:
break;
}
Console.Clear();
} while (choice != "C");
}
public static void RunPing()
{
//timer
System.Timers.Timer aTimer = new System.Timers.Timer();
aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
aTimer.Interval = 5000;
aTimer.Enabled = true;
Console.WriteLine("Press 'B' to stop.");
while (Console.Read() != 'B');
}
private static void OnTimedEvent(object source, ElapsedEventArgs e)
{
//csv reader
using (TextFieldParser parser = new TextFieldParser("Project04_URLs.csv"))
{
parser.TextFieldType = FieldType.Delimited;
parser.SetDelimiters(",");
while (!parser.EndOfData)
{
string[] fields = parser.ReadFields();
foreach (string URL in fields)
{
try
{
//ping
Ping myPing = new Ping();
PingReply reply = myPing.Send(URL, 5000);
if (reply != null)
{
//write ping to other csv
StreamWriter writer = new StreamWriter("Ping_Data.csv");
writer.WriteLine("Status : " + reply.Status + " \n Time : " + reply.RoundtripTime.ToString() + " \n Address : " + reply.Address);
}
}
catch
{
Console.WriteLine("ERROR: You have Some TIMEOUT issue");
}
Console.ReadKey();
Console.Clear();
}
}
}
}
}
}
初始CSV文件(Project04_URLs)包含这些网址。
na02.mypinpointe.com
na03.mypinpointe.com
na04.mypinpointe.com
na05.mypinpointe.com
na06.mypinpointe.com
na07.mypinpointe.com
na08.mypinpointe.com
na09.mypinpointe.com
na10.mypinpointe.com
na11.mypinpointe.com
第二个CSV文件(Ping_Data)为空。
感谢您提供任何帮助。
答案 0 :(得分:0)
您的代码的一些观察结果:
您的计时器每隔5秒触发一次 - 这意味着您的代码每隔5秒就会尝试ping CSV文件中的每个网址。
在For循环结束时有一个Console.ReadKey() - 它将在每次迭代中停止执行并等待用户输入。
在for循环中 - 你有一个无关的StreamWriter打开并一直写入同一个文件(文件名是硬编码) - 这意味着(连同#1)你可能有文件访问问题 - 其中不止一个thread(timer fire)正在同一个磁盘文件上运行。此外,输入csv文件也被多次打开。
建议:
使用TextFieldParser - 在短范围内。也许只是提取字符串数组中的url并处理TextFieldParser
在for循环中ping每个url后,你真的需要Console.ReadKey()吗?如果您离开计算机20分钟,则有许多线程在等待控制台输入。在控制台上按下B后,使用线程同步技术(例如:ManualResetEvent)设计定时器线程退出。或者您也可以使用从MAIN()方法设置的"廉价hack" bool变量,并每次检查Timer fire方法中的bool变量,如果设置则返回。
为输出csv文件创建动态名称,并在其中写入Ping结果。像
这样的东西var wrtr = new StreamWriter(string.Format(" Ping_Data_ {0} _ {1} .csv",URL,DateTime.Now.ToString(" ddMMyyyy-HHmmss") ));
这就是我的代码(仍然不知道你为什么需要一个Timer)。请注意,bool _Terminate是一个可耻的退出标志 - 意味着每个计时器线程将尽快退出。另一种策略是删除bool标志本身(即仅禁用定时器)。在这种情况下,每个线程一完成所有工作量就会退出(即CSV中的所有URL都被ping了)。
completed