2014-02-28 83 views
0

对于我的C#程序,我创建了下面的对象。从子类访问主窗体

processurls processurls1 = new processurls(); 

后,我创造它,我点击一个按钮来开始我的计时器,它执行:

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

该定时器每500毫秒会触发我processurls1对象的pURLS功能。 它会每次更新我的主表单标签label1.text。 但我的问题是它只会更新标签一次,我的程序运行非常笨重。什么是安全的方式来传递标签对象& picturebox对象到我的子类在主窗体上正确更新没有滞后?

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) 
    { 
    } 
} 
+0

你应该做的第一件事就是要摆脱这一切,除了吃'catch'块地看到,实际上可能任何错误发生。 –

回答

0

您需要了解异步基础。

也许500毫秒不足以获取/数据。除了使用定时器,只需要使用一个异步任务与该女士睡眠

在您的MainForm

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(); 
} 

最后,添加“异步“关键字pUrls:

public async Task pURLS 
+0

不能等待'空'吗? – Illuminati

0

将所有我的变量移入类本身。现在,我可以从我的BackgroundWorker访问属性和更新的主要形式有: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; 
     } 
    }