如果下载出现异常,是否可以通过这种逻辑来重置列表并再次调用Init()?

摩西流星

我如何向用户报告问题,并且问题正在再次尝试?并且我应该像现在那样重新设置所有内容并再次调用Init()来执行此操作,还是应该使用计时器并等待几秒钟再尝试一次?

在课堂上我做了:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Net;
using System.Xml;
using HtmlAgilityPack;
using System.ComponentModel;

namespace TestingDownloads
{
    class ExtractImages
    {
        static WebClient client;
        static string htmltoextract;
        public static List<string> countriescodes = new List<string>();
        public static List<string> countriesnames = new List<string>();
        public static List<string> DatesAndTimes = new List<string>();
        public static List<string> imagesUrls = new List<string>();
        static string firstUrlPart = "http://www.sat24.com/image2.ashx?region=";
        static string secondUrlPart = "&time=";
        static string thirdUrlPart = "&ir=";

        public class ProgressEventArgs : EventArgs
        {
            public int Percentage { get; set; }
            public string StateText { get; set; }
        }

        public event EventHandler<ProgressEventArgs> ProgressChanged;

        public void Init()
        {
            object obj = null;
            int index = 0;
            ExtractCountires();
            foreach (string cc in countriescodes)
            {
                // raise event here
                ProgressChanged?.Invoke(obj,new ProgressEventArgs{ Percentage = 100 * index / countriescodes.Count, StateText = cc });
                ExtractDateAndTime("http://www.sat24.com/image2.ashx?region=" + cc);
                index +=1;
            }
            ImagesLinks();
        }


        public void ExtractCountires()
        {
            try
            {
                htmltoextract = "http://sat24.com/en/?ir=true";//"http://sat24.com/en/";// + regions;
                client = new WebClient();
                client.DownloadFile(htmltoextract, @"c:\temp\sat24.html");
                client.Dispose();

                string tag1 = "<li><a href=\"/en/";
                string tag2 = "</a></li>";

                string s = System.IO.File.ReadAllText(@"c:\temp\sat24.html");
                s = s.Substring(s.IndexOf(tag1));
                s = s.Substring(0, s.LastIndexOf(tag2) + tag2.ToCharArray().Length);
                s = s.Replace("\r", "").Replace("\n", "").Replace(" ", "");

                string[] parts = s.Split(new string[] { tag1, tag2 }, StringSplitOptions.RemoveEmptyEntries);


                string tag3 = "<li><ahref=\"/en/";

                for (int i = 0; i < parts.Length; i++)
                {
                    if (i == 17)
                    {
                        //break;
                    }
                    string l = "";
                    if (parts[i].Contains(tag3))
                        l = parts[i].Replace(tag3, "");

                    string z1 = l.Substring(0, l.IndexOf('"'));
                    if (z1.Contains("</ul></li><liclass="))
                    {
                        z1 = z1.Replace("</ul></li><liclass=", "af");
                    }
                    countriescodes.Add(z1);
                    countriescodes.GroupBy(n => n).Any(c => c.Count() > 1);

                    string z2 = parts[i].Substring(parts[i].LastIndexOf('>') + 1);
                    if (z2.Contains("&amp;"))
                    {
                        z2 = z2.Replace("&amp;", " & ");
                    }
                    countriesnames.Add(z2);
                    countriesnames.GroupBy(n => n).Any(c => c.Count() > 1);
                }
            }
            catch (Exception e)
            {
                if (countriescodes.Count == 0)
                {
                    countriescodes = new List<string>();
                    countriesnames = new List<string>();
                    DatesAndTimes = new List<string>();
                    imagesUrls = new List<string>();
                    Init();
                }
            }
        }

        public void ExtractDateAndTime(string baseAddress)
        {
            try
            {
                var wc = new WebClient();
                wc.BaseAddress = baseAddress;
                HtmlDocument doc = new HtmlDocument();

                var temp = wc.DownloadData("/en");
                doc.Load(new MemoryStream(temp));

                var secTokenScript = doc.DocumentNode.Descendants()
                    .Where(e =>
                           String.Compare(e.Name, "script", true) == 0 &&
                           String.Compare(e.ParentNode.Name, "div", true) == 0 &&
                           e.InnerText.Length > 0 &&
                           e.InnerText.Trim().StartsWith("var region")
                          ).FirstOrDefault().InnerText;
                var securityToken = secTokenScript;
                securityToken = securityToken.Substring(0, securityToken.IndexOf("arrayImageTimes.push"));
                securityToken = secTokenScript.Substring(securityToken.Length).Replace("arrayImageTimes.push('", "").Replace("')", "");
                var dates = securityToken.Trim().Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries);
                var scriptDates = dates.Select(x => new ScriptDate { DateString = x });
                foreach (var date in scriptDates)
                {
                    DatesAndTimes.Add(date.DateString);
                }
            }
            catch
            {
                countriescodes = new List<string>();
                countriesnames = new List<string>();
                DatesAndTimes = new List<string>();
                imagesUrls = new List<string>();
                this.Init();
            }
        }

        public class ScriptDate
        {
            public string DateString { get; set; }
            public int Year
            {
                get
                {
                    return Convert.ToInt32(this.DateString.Substring(0, 4));
                }
            }
            public int Month
            {
                get
                {
                    return Convert.ToInt32(this.DateString.Substring(4, 2));
                }
            }
            public int Day
            {
                get
                {
                    return Convert.ToInt32(this.DateString.Substring(6, 2));
                }
            }
            public int Hours
            {
                get
                {
                    return Convert.ToInt32(this.DateString.Substring(8, 2));
                }
            }
            public int Minutes
            {
                get
                {
                    return Convert.ToInt32(this.DateString.Substring(10, 2));
                }
            }
        }

        public void ImagesLinks()
        {
            int cnt = 0;
            foreach (string countryCode in countriescodes)
            {
                cnt++;
                for (; cnt < DatesAndTimes.Count(); cnt++)
                {
                    string imageUrl = firstUrlPart + countryCode + secondUrlPart + DatesAndTimes[cnt] + thirdUrlPart + "true";
                    imagesUrls.Add(imageUrl);
                    if (cnt % 10 == 0) break;
                }
            }
        }
    }
}

在我使用try和catch的两种情况下,如果要捕获,我将通过重置Lists并再次调用Init()来尝试整个操作。

然后在form1中

ExtractImages ei = new ExtractImages();

        public Form1()
        {
            InitializeComponent();

            ProgressBar1.Minimum = 0;
            ProgressBar1.Maximum = 100;
            backgroundWorker1.RunWorkerAsync();
        }

背景工作者的事件

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            if (backgroundWorker1.CancellationPending == true)
            {
                e.Cancel = true;
                return; // this will fall to the finally and close everything    
            }
            else
            {
                ei.ProgressChanged += (senders, eee) => backgroundWorker1.ReportProgress(eee.Percentage, eee.StateText);
                ei.Init();
            }
        }

        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            ProgressBar1.Value = e.ProgressPercentage;
            label7.Text = e.UserState.ToString();
            label8.Text = e.ProgressPercentage + "%";
        }

        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
           if (e.Error == null)
            {
                ProgressBar1.Value = 100;
            }
           else
            {

            }
        }

另一件事不确定是否有问题。当类没有问题时,我会在label7的form1中看到所有从头到尾运行的代码。但是progressBar1.Value和label8都只达到了97%,所以我需要在完成的事件中添加progressBar1.Value = 100;。可以吗?班上的报告计算是否有问题?

费德 g

对于第一个问题:更好地在客户端捕获异常并显示错误消息,因为当某事出错时,您可能需要控制程序的行为。考虑一下:根据您的代码,如果页面的DOM结构更改了,您的程序可能会抛出期望,每个异常都被捕获client.DownloadFile一次,如果发生这种情况,您将需要知道出了什么问题,如果您不更改代码行为,则此类高频率客户端。DownloadFile执行将导致网站的防火墙阻止ip一段时间。我认为在客户端添加计时器是一个好主意。

对于第二个问题:您是否定义了如何处理RunWorkerCompleted事件?

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在使用 ChannelWriter 的 SignalR Core 中:如果出现异常,我是否需要调用 TryComplete 两次?

如果输入不是bigDecimal,如何抛出异常并再次扫描?

Getmethod调用失败,出现异常

进行REST调用时出现异常

调用函数时出现异常

调用更新数据时出现异常

WPF:如果在非 UI 线程上调用 new EllipseGeometry() 会出现异常

Haproxy + netty:如何防止连接重置时出现异常?

如果在向下箭头单击小部件组合时调用 focus_get(),则出现异常 KeyError

如果出现异常,如何在 mips 中调试循环

重置ARView并再次运行辅导叠加

调用隐式声明的函数时出现异常行为

传递调用'createUser'的结果时出现异常

Eureka服务器调用API时出现异常

调用 std::call_once 时出现异常

通过Java创建Kafka主题时出现异常

通过 rmi 参数发送对象时出现异常

通过JDBC连接SciDB时出现异常

从API返回结果列表时出现异常错误

我的自定义列表视图崩溃,出现异常

django bulk_create 是否可能出现异常

通过在jQuery中再次单击来调用Click函数?是否有可能

是否可以通过设置函数的属性来调用函数?

如何避免通过再次按下按钮来重置值

我可以通过在redux表单中调用一次reset来重置多个表单吗

隐藏横幅并再次调用它?

自执行匿名函数并再次调用

执行m子批处理流程时出现异常,例如无法通过提及文件路径来删除对象存储中的文件

TypeScript是否可以通过“提取的”布尔逻辑来推断已区分联合的类型?