我正在尝试在设置某些属性的方法中应用线程。但在应用线程后,该方法将停止设置值。我的代码:
Class 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;
在应用Thread之前,所有值都设置正确,但现在它们的所有值都设置为0.
答案 0 :(得分:1)
您的问题是,您正试图在numOfResults
电话后立即阅读MyThread.Start();
和其他变量。但是,此时线程可以在几个可能的thread states中的任何一个中 - 它可能甚至可以完成,尽管这可能是最不可能的结果。
当您尝试获取有关线程完成的数据时,您有几个选项:
使用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链接(重复它们没有意义,所以我只在这里链接它们):
答案 1 :(得分:1)
使用MyThread.Join()方法等待线程完成。 Join是一个阻塞函数,等到完成。您可以为Join提供超时持续时间,之后它将会产生。