2014-02-23 20 views
2

我試圖在設置某些屬性的方法中應用線程。但是在應用線程之後,該方法停止設置值。我的代碼:無法在設置某些類屬性的方法中線程化

類Page.cs

public int numOfResults { get; private set; } 

public int perPage { get; private set; } 

public int pageCount { get; private set; } 

public void pageResults() 
{ 
    HtmlWeb htmlWeb = new HtmlWeb(); 
    HtmlDocument document = htmlWeb.Load(this.url); 

    var totalResults = document.DocumentNode 
           .Descendants("div") 
           .Where(x => x.Attributes.Contains("class") && 
              x.Attributes["class"].Value.Contains("result-totals")); 

    string totalPages = string.Empty; 

    foreach (var result in totalResults) 
    { 
     if (result.InnerHtml != null) 
     { 
      totalPages = result.InnerHtml; 
      totalPages = totalPages.Substring(totalPages.LastIndexOf("f") + 1, 4); 
      numOfResults = Convert.ToInt32(totalPages.Trim()); 
     } 
    } 

    var resultsSet = document.DocumentNode 
          .Descendants("div") 
           .Where(x => x.Attributes.Contains("class") && 
              x.Attributes["class"].Value.Contains("business-container-inner")); 

    perPage = 0; 
    foreach (var result in resultsSet) 
     if (result.InnerHtml != null) 
      perPage++; 

    pageCount = (numOfResults/perPage) + 1; 
} 

電話:

Pages htmlDoc = new Pages(url); 
Thread MyThread = new Thread(htmlDoc.pageResults); 
MyThread.Start(); 
lblTotalRecords.Text = "Records Found : " + htmlDoc.numOfResults.ToString(); 
lblTotalRecords.Visible = true; 
lblTotalPages.Text = "Pages Found : " + htmlDoc.pageCount.ToString(); 
lblTotalPages.Visible = true; 

之前應用主題的所有值都設置正確,但現在他們所有的值設置爲0。

+0

在一個單獨的線程中做什麼?似乎你需要等待你的線程完成分配* lblTotalRecords *之前。 – thepirat000

回答

1

您的問題是,您正嘗試在MyThread.Start();調用之後讀取numOfResults和其他變量。然而,該線程可能會在幾個可能的thread states中的任何一個 - 它可能可能甚至完成,雖然這可能是最不可能的結果。

當你試圖獲得有關線程完成數據,你有幾個選擇:

  • 使用BackgroundWorker - 它有信號的線程與它的工作完成的事件。它使用起來也很簡單。
  • 創建一個實現線程函數的專用類,並在完成時聲明一個事件。

使用BackgroundWorker很可能在您的方案簡單的解決方案(因爲你試圖更新Label控制)。另一種解決方案是這樣的:

public class MyThreadWorker 
{ 
    public event EventHandler<MyDoneEventArgs> Done; 

    // TODO set input parameters through constructor or public properties 

    public void DoWork() 
    { 
     // TODO process work 
     // TODO raise Done event 
    } 
} 

這裏有一些其他SO與更詳細鏈接(在重複他們是沒有意義的,所以我只能在這裏將它們鏈接):

+0

非常感謝您的時間和建議。但我仍然困惑,我怎麼才能得到的價值屬性?請指導我。 – Pranab

+0

@Pranab我更新了我的答案。 – xxbbcc

+0

非常感謝。這些鏈接幫助了我很多。再一次感謝你 – Pranab

1

使用MyThread.Join()方法來等待爲線程完成。加入是一個阻塞功能,並等待完成。您可以提供超時持續時間以進行連接,之後它將產生。