【问题标题】:Access Main Form from Subclass从子类访问主窗体
【发布时间】:2014-03-31 23:29:32
【问题描述】:

对于我的 C# 程序,我创建了以下对象。

processurls processurls1 = new processurls();

创建它后,我单击一个按钮来启动我的计时器,该计时器将执行:

private void timer2_Tick(object sender, EventArgs e)
{
    processurls1.pURLS(UrlList, URLCountOf, HTTP, label1, TotalURLS2, TotalURLS);
}

此计时器每 500 毫秒将触发我的 processurls1 对象的 pURLS 函数。 它每次都会更新我的主要表单 Label label1.text 。 但我的问题是它只会更新一次标签,而且我的程序运行起来非常笨拙。将标签对象和图片框对象传递给我的子类以在主窗体上正确更新而没有延迟的安全方法是什么?

public void pURLS(List<string> UrlListOf, int Count, Images HTTP, Label label1, int TotalURLS2, int TotalURLS)
{
    try
    {
        string WebResponse = HTTP.DoGET(UrlListOf[Count]);
        string pattern = "href=\"(.*?)\"";
        MatchCollection OtherURLS = Regex.Matches(WebResponse, pattern);
        for (int i = 0; i < OtherURLS.Count; i++)
        {

            Match HasHttp = Regex.Match(OtherURLS[i].Value, "http");
            if (HasHttp.Success)
            {
                string CleanedUp = Regex.Replace(OtherURLS[i].Value, "href=\"", "");
                CleanedUp = Regex.Replace(CleanedUp, "\"", "");

                UrlListOf.Add(CleanedUp);
                TotalURLS2++;
            }
            else
            {
                string CleanedUp = Regex.Replace(OtherURLS[i].Value, "href=\"", "");
                CleanedUp = Regex.Replace(CleanedUp, "\"", "");
                CleanedUp = UrlListOf[TotalURLS2] + "" + CleanedUp;
                UrlListOf.Add(CleanedUp);
                TotalURLS2++;
            }
        }

        label1.Text = "U:" + TotalURLS2.ToString();
    }
    catch (Exception)
    {
    }
}

【问题讨论】:

  • 您应该做的第一件事是摆脱这个吃所有异常的catch 块,以查看实际可能发生的任何错误。

标签: c# winforms


【解决方案1】:

您需要学习异步基础。

也许 500 毫秒不足以获取/数据。而不是使用计时器,只需使用具有 xx ms 睡眠的异步任务

在您的主窗体上

public async Task UpdateMyLabels()
{
  while (true) //change here by something more reliant
  {
       await processurls1.pURLS(UrlList, URLCountOf, HTTP, label1, TotalURLS2, TotalURLS);
       Thread.Sleep(200); //ajust value here
  }
}

在您的“表单加载”事件中:

{
       UpdateMyLabels();
}

最后,在 pU​​rls 上添加“async”关键字:

public async Task pURLS

【讨论】:

    【解决方案2】:

    将我所有的变量移到类本身中。现在我可以从我的后台工作人员访问一个属性并更新主窗体:D

        static int ImageCount = 0;
        static int currentImage = 0;
        Images HTTP = new Images();
        List<string> UrlList;
        static List<string> ImageCollection = new List<string>();
    
        public List<string> Images
        {
            get
            {
                return ImageCollection;
            }
            set
            {
                ImageCollection = value;
            }
        }
    
        public int CurrentImage
        {
    
            get
            {
                return currentImage;
            }
            set
            {
                currentImage = value;
            }
        }
        public int Count
        {
            get
            {
                return ImageCount;
            }
            set
            {
                ImageCount = value;
            }
        }
    
        public List<string> URLS
        {
            get
            {
                return UrlList;
            }
            set
            {
                UrlList = value;
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2011-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多