我尝试以固定间隔读取文件,然后将查询的数据发送到特定的Web服务器。以下是我正在使用的代码,但服务启动和停止而不做任何事情。我无法弄清楚这个错误。
public partial class IPTProjectService : ServiceBase
{
private Thread checkingThread;
private System.Timers.Timer timer;
Boolean sendingTime;
public IPTProjectService()
{
InitializeComponent();
checkingThread = new Thread(update);
timer = new System.Timers.Timer(Properties.Settings.Default.TIMEINTERVAL);
timer.Elapsed += timer_Elapsed;
sendingTime = true;
}
void timer_Elapsed(object sender, ElapsedEventArgs e)
{
setSendingTime();
if (!File.Exists("Testfile.txt"))
{
File.Create("Testfile.txt");
timer_Elapsed(sender, e);
}
else
{
File.WriteAllText("Testfile.txt", timer.ToString());
}
}
private void setSendingTime()
{
sendingTime = true;
}
private void update()
{
while (true)
{
if (sendingTime)
{
CarpoolWebClient.sendData(Properties.Settings.Default.DATAFILE);
sendingTime = false;
}
}
}
protected override void OnStart(string[] args)
{
try
{
timer.Start();
checkingThread.Start();
}
catch (Exception ex)
{
Debug.Fail(ex.ToString());
}
}
protected override void OnStop()
{
try
{
timer.Stop();
checkingThread.Abort();
}
catch(Exception e)
{
StreamWriter writer = new StreamWriter("testfile.txt", true);
writer.Write(e.ToString());
writer.Close();
}
}
}
class CarpoolWebClient
{
public static void sendData(String fileName)
{
WebRequest req = null;
WebResponse rsp = null;
try
{
//URL of message broker
string uri = "http://localhost/IPTProject/receive_xml.php";
req = WebRequest.Create(uri);
req.Method = "POST";
req.ContentType = "text/xml";
// Wrap the request stream with a text-based writer
StreamWriter writer = new StreamWriter(req.GetRequestStream());
// Write the xml text into the stream
writer.WriteLine(GetTextFromXMLFile(@fileName));
writer.Close();
rsp = req.GetResponse();
}
catch (WebException webEx)
{
//MessageBox.Show(webEx.Message);
throw webEx;
}
catch (Exception ex)
{
//MessageBox.Show(ex.Message);
throw ex;
}
finally
{
if (req != null) req.GetRequestStream().Close();
if (rsp != null) rsp.GetResponseStream().Close();
}
}
private static string GetTextFromXMLFile(string file)
{
StreamReader reader = new StreamReader(file);
string ret = reader.ReadToEnd();
reader.Close();
return ret;
}
}
答案 0 :(得分:1)
如果可以,请调试服务。如果这是一个问题,因为服务设置为自动启动,那么你可以使用这个“技巧”到automatically attach the debugger并找出出错的方式。
答案 1 :(得分:0)
致电
File.Create("Testfile.txt");
timer_Elapsed(sender, e);
将创建一个文件并将FileStream
返回给新创建的文件。此文件随后仍处于打开状态,然后调用timer_Elapsed
并导致应用程序失败,因为它无法再次打开文件。请参阅主题的MSDN Docs。
您的代码不需要Create调用,您可以简单地将方法添加到下面的示例中,它应该可以解决此问题。或者,关闭FileStream
对象。
void timer_Elapsed(object sender, ElapsedEventArgs e)
{
setSendingTime();
File.WriteAllText("Testfile.txt", timer.ToString());
}
File.WriteAllText
将创建文件,如果它不存在,并覆盖该文件(如果它存在),实际上与您的检查相同。
如果这不能解决问题,请检查事件日志中的错误,或者在记录错误消息的timer_Elapsed
和update
方法中提供错误处理代码。
答案 2 :(得分:0)
当我在我自己的计算机上请求网络服务器,即localhost时,我没有注意到wampserver没有运行。我查看了显示WebException的事件日志。启动wampserver代码工作正常。谢谢大家。
答案 3 :(得分:0)
是的,我经常遇到类似的问题......
记录所有未捕获的异常:
// Somewhere at the start of the constructor:
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
[...]
void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
// Log exeption e.ExceptionObject.ToString to a file
}
另外,我会在update方法中使用try-catch + log来确保如果线程因任何未知原因退出,你会发现原因。
如果这些东西不起作用,它通常会像丢失的DLL,不正确的DLL版本(64/32位混合)或类似的东西一样愚蠢。这可以在事件日志中找到。
应该这样做: - )
答案 4 :(得分:0)
如果您在安装了Visual Studio的计算机上运行此程序(例如,您的开发计算机),请添加对
的调用System.Diagnostics.Debugger.Launch();
在你的创业公司或适当的地方。这将启动Visual Studio调试器,因此您不必解决计时问题(在手动连接调试器之前服务停止)