C# 无法在设置某些类属性的方法中执行线程

C# 无法在设置某些类属性的方法中执行线程,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();

我试图在一个设置一些属性的方法中应用线程。但应用线程后,该方法停止设置值。我的代码:

类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。

您的问题是,您正试图读取
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之前,似乎需要等待线程完成。