C# 无法在设置某些类属性的方法中执行线程
我试图在一个设置一些属性的方法中应用线程。但应用线程后,该方法停止设置值。我的代码: 类Page.csC# 无法在设置某些类属性的方法中执行线程,c#,multithreading,C#,Multithreading,我试图在一个设置一些属性的方法中应用线程。但应用线程后,该方法停止设置值。我的代码: 类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();
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。您的问题是,您正试图读取
numOfResults
以及MyThread.Start()之后的其他变量代码>呼叫。然而,这个线程可能是在这一点上的几个可能的线程中的任何一个——它甚至可能完成,尽管这可能是最不可能的结果
当您尝试获取有关线程完成的数据时,您有几个选项:
- 使用-它有一个事件,表示线程已完成其工作。它使用起来也很简单
- 创建一个专用类来实现thread函数,并在完成时声明一个事件
在您的场景中,使用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
}
}
public类读取器
{
公共事件事件处理程序完成;
//TODO通过构造函数或公共属性设置输入参数
公共空间工作()
{
//待办事项处理工作
//TODO raise Done事件
}
}
这里有一些其他更详细的SO链接(重复它们没有意义,所以我只在这里链接):
使用MyThread.Join()方法等待线程完成。Join是一个阻塞函数,等待完成。您可以提供加入的超时时间,超过此时间后将产生。非常感谢您的时间和建议。但是我仍然很困惑,我怎么才能得到属性的值呢?请引导我,非常感谢。这些链接对我帮助很大。再次感谢您在单独的线程中这样做有什么意义?在分配lblTotalRecords之前,似乎需要等待线程完成。