【问题标题】:C# how to increment variable in constructor - windows service [closed]C#如何在构造函数中增加变量-Windows服务[关闭]
【发布时间】:2013-04-19 20:54:23
【问题描述】:

我有一个 Windows 服务,我想在调用构造函数时更改 URL。我通过将变量连接到构造函数中来形成 URL,并且变量正在递增(如下面的代码所示)。

但是,URL 没有改变,我仍然从 URL 下载相同的 XML 文件。

我试过这个:

private string Url;
    private string Name = @"D:\test\userko.xml";
    private System.Timers.Timer timer;

    private Downloader xd;
    private static int i;



    public Service1()
    {
        InitializeComponent();
        while (i < 5000)
        {
            Url = "http://tis-toolbox.appspot.com/api/user/id/" + i + ".xml";
            i++;
            if (i == 4999)
                i = 0;
            break;
        }

        xd = new Downloader(Url, Name);
        timer = new System.Timers.Timer();
        timer.Enabled = true;
        timer.Interval = 1000;
        timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
    }

    protected override void OnStart(string[] args)
    {
        EventLog.WriteEntry("PCTrss reader Service Started.");
        tryDownload();
    }

    protected override void OnStop()
    {
        EventLog.WriteEntry("PCTrss reader Service was shutdown.");
    }

    private void timer_Elapsed(object sender, EventArgs e)
    {
        tryDownload();
    }

    private void tryDownload()
    {
        try
        {
            timer.Stop();
            xd.DownloadXML();
            EventLog.WriteEntry("PCTrss reader downloaded news at " + xd.LastUpdate + ". XML is in " + Name);
        }
        catch (Exception ex)
        {
            EventLog.WriteEntry("PCTrss reader Service cannot download feeds " + ex.ToString());
        }
        finally
        {
            timer.Start();
        }
    }
}

这里是下载器类。它从 URL 读取并保存一个 XML 文件。

class Downloader
{
    public DateTime LastUpdate;
    public string Url { get; set; }
    public string Name { get; set; }

    public Downloader(string url, string name) 
    {
        this.Url = url;
        this.Name = name;
    }

    public void DownloadXML()
    {
        if (!Directory.Exists(@"D:\test"))
            Directory.CreateDirectory(@"D:\test");

        LastUpdate = DateTime.Now;



        WebClient client = new WebClient();
        client.Encoding = Encoding.UTF8;
        using( Stream stream = client.OpenRead(Url) )
        using( StreamReader sr = new StreamReader(stream) )
        using( FileStream fs = new FileStream(Name, FileMode.Create, FileAccess.Write))
        using( StreamWriter sw = new StreamWriter(fs) )
        {
            string s = sr.ReadToEnd();
            sw.BaseStream.Seek(0, SeekOrigin.End);
            sw.Write(s);
        }
    }
}

【问题讨论】:

  • 变量i在哪里声明?它是类的字段/属性吗?另外,您遇到的错误是什么?
  • i 是一个全局变量。没有错误..但是xml不会下载。当我在没有 while 循环的情况下运行它时一切正常。但我需要更改 url。
  • 我认为您需要澄清您的问题并向我们展示“Downloader()”的代码,以及您在哪里定义“名称”,xd 是什么?您希望 xml 最终出现在哪里?
  • 提供的代码没有意义....假设您将变量 i 初始化为 0(并且执行 ),它永远不会达到 5000,因为 break stmt,那为什么那里的代码。另外,构造函数只会运行一次(当服务被实例化时)。说到windows服务,通常你不会有一堆实例同时运行,不知道你想做什么......
  • 我编辑帖子并添加下载器的代码。

标签: c# c#-4.0 windows-services webclient


【解决方案1】:

有几个问题:

首先,正如 berXpert 所说,while 循环中的正确子句应该是 i &lt; 5000。其次,如果要下载5000次,整个代码应该在while循环中

while (i < 5000)    
{
    Url = "http://tis-toolbox.appspot.com/api/user/id/" + i + ".xml";
    i++;
    xd = new Downloader(Url, Name);
    timer = new System.Timers.Timer();
    timer.Enabled = true;
    timer.Interval = 1000;
    timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
}

另外,while 循环中不需要 break,它不会执行超过 5000 次(假设 i 开始为 0)

【讨论】:

  • 它的 wokr 但我想使用下载的 xml 并且这段代码太快了。它会立即下载索引为 4999 的 xml
  • 我添加了代码 System.Threading.Thread.Sleep(1000);但是出现系统错误Error 1053 服务没有及时响应启动或控制请求
【解决方案2】:

一定要把while子句改成

i < 5000

并将i 作为共享静态属性

private static int;

【讨论】:

  • i 这样的迭代变量应该在与迭代本身相同的范围内声明。不是类的私有字段,当然也不是静态的
猜你喜欢
  • 2022-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-26
相关资源
最近更新 更多