gpt4 book ai didi

c# - 无法在设置某些类属性的方法中线程化

转载 作者:太空宇宙 更新时间:2023-11-03 10:49:39 25 4
gpt4 key购买 nike

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

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

最佳答案

您的问题是您试图在 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 链接(没有必要重复它们,所以我只在这里链接它们):

关于c# - 无法在设置某些类属性的方法中线程化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21963434/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com