gpt4 book ai didi

c# - 忙等待线程

转载 作者:行者123 更新时间:2023-11-30 13:33:09 24 4
gpt4 key购买 nike

基本上,我需要忙着等到某个 html 出现在网页上。我创建了以下代码来忙着等我:

public void ExecuteBusyWaitThreads()
{

foreach (Canidate canidate in allCanidates)
{
Thread newThread = new Thread(delegate()
{
BusyWait(canidate);
});

newThread.Start();
}
}

public bool BusyWait(Canidate canidate)
{
//hit that url, and wait for the claim all button to appear
string page = null;
while (found == false)
{
HttpWebRequest request = Canidate.GetHTTPRequest(canidate.URL);
//make sure we add the authentication cookes to the request
request = Canidate.AddCookiesToRequest(request, canidate.GetCookies());
page = new Canidate().GetPage(request);
if (page.ToLower().Contains("claim all"))
{
found = true;
NotifyAllThreads();
}
}
return true;
}

所以,如果我有 8 个 canidates,它会产生 8 个线程,每个线程都在寻找 claim all 出现在网页上。 found 是一个全局变量。一旦其中一个线程找到 claim all,它们都应该退出。

我有几个关于这种方法的问题。首先,这是一个好方法。其次,每个线程是否会得到自己的忙等待函数的“副本”。我的意思是,一个线程可以抢占另一个线程并更改该函数中的数据,还是每个线程都获得函数内声明的变量的副本。请注意,这两个函数都在同一个对象中。

最佳答案

在回答您的问题之前,我必须指出您犯下了 closing over the loop variable 的恶劣行为.

First off, its it a good approach.

不,不是真的。任意创建线程通常不是一个好主意。最好使用线程池技术。这可以通过 ThreadPool.QueueUserWorkItemTask 类来完成。

Second, will each thread get its own "copy" of the busy wait function. By that I mean, can one thread preempt another and change the data in that function, or do they each get a copy of the variables declared inside the function.

BusyWait 的每个运行实例都将获得所有局部变量的副本(即 pagerequest)。由于 found 是在非本地范围内声明的(大概无论如何),因此它将在 BusyWait 的所有运行实例之间共享。因此,您当前对 found 的读写操作不是线程安全的,因为没有适当的同步机制。

关于c# - 忙等待线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9622664/

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