簡體   English   中英

如何從backgroundworker dowork事件向listView以及toolStripStatusLabel報告?

[英]How can i report from backgroundworker dowork event to listView and also to toolStripStatusLabel?

我有這種方法,我是從backgroundworker dowork事件調用它的:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            GetForumsInfo();
        }

方法:

string res;
        private void GetForumsInfo()
        {
            int countResults = 0;
            int index = 0;
            int index1 = 0;
            List<string> forumsNames = new List<string>();
            string[] lines = File.ReadAllLines(@"C:\testhtml\htmlloaded.txt");
            List<string> ttt = new List<string>();
            for (int i = 0; i < lines.Length; i++)
            {
                Regex myTitle = new Regex("(?<=title=\").*?(?=\"\\>)");
                //string strTargetString = @"<a href=""/Forums2008/forumPage.aspx?forumId=690"" title=""ישראלים בקנדה"">ישראלים בקנדה</a>" + "\n" + @" ";

                if (lines[i].Contains("Forums2008/forumPage.aspx?forumId="))
                {
                    string firstTag = "Forums2008/forumPage.aspx?forumId=";
                    string lastTag = "title";
                    int indx = lines[i].IndexOf(firstTag);
                    int indx2 = lines[i].IndexOf(lastTag, indx);
                    res = lines[i].Substring(indx + 34, indx2 - indx - 36);
                    string titleResult = myTitle.Match(lines[i]).Value;

                    string endTag = "</a>";


                    index = forums.IndexOf(firstTag, index1);

                    if (index == -1)
                        continue;

                    var secondIndex = forums.IndexOf(endTag, index);*/
                    StreamWriter w = new StreamWriter(@"c:\testmytext\tt.txt");
                    w.WriteLine(titleResult);
                    w.Close();
                    if (!forumsNames.Contains(titleResult))
                    {
                        if (!titleResult.Contains("&quot;"))
                        {
                                arr[0] = titleResult;//"product_1";
                                arr[1] = res;

                                itm = new ListViewItem(arr);
                                backgroundWorker1.ReportProgress(0, res);

                            ttt.Add(res);
                            countResults++;
                            string SummaryText = String.Format("Forum Name {0} / {1}",
                                                               titleResult, countResults);
                            //backgroundWorker1.ReportProgress(0, SummaryText);//titleResult);
                            forumsNames.Add(titleResult);
                        }
                    }
                    index1 = index + 1;
                }
            }
            numberofforums = forumsNames.Count;
            SaveToListView();
        }

在我報告SummaryText之前,我現在僅報告變量res。 這是backgroundworker進度更改事件的代碼:

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            //toolStripStatusLabel1.Text = e.UserState.ToString();
            listView1.Items.Add(e.UserState.ToString());
        }

但是現在我想向UserState報告三個對象:

  1. 變量res
  2. 變量titleResult
  3. 變量SummaryText變量。

並在progressChanged事件中使用res和titleResult更新listview,並使用SummaryText更新toolStripStatusLabel1。

嘗試使用谷歌,但我不明白如何將更多的參數傳遞給reportprogress以及如何在progressChanged中對其進行更新。

創建一個類,其中包含要傳遞給ProgressChanged-Event的屬性,例如:

internal class BachgroundWorkerProgressItem
{
  internal BachgroundWorkerProgressItem(string res, string titleResult, string summaryText)
  {
    Res = res;
    TitleResult = titleResult;
    SummaryText = summaryText:
  }

  internal string Res { get; private set; }
  internal string TitleResult { get; private set; }
  internal string SummaryText { get; private set; }
}

通過UserState傳遞給ProgressChanged-Event的這種類型的對象。 並且,如果您必須:

BachgroundWorkerProgressItem item = (BachgroundWorkerProgressItem)e.UserState;

您還可以將BachgroundWorkerProgressItem創建為嵌套類,如果不想在其他任何地方使用它,可以將其設為私有。

要傳遞這種類型的對象,您必須像這樣調用ReportProgress:

backgroundWorker1.ReportProgress(0, new BachgroundWorkerProgressItem(res, titleResult, summaryText));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM