线程忙等待

2024-04-27

基本上,我需要忙着等待一些 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;
    }

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

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


在回答你的问题之前,我必须指出你犯下了令人震惊的行为:关闭循环变量 http://blogs.msdn.com/b/ericlippert/archive/2009/11/12/closing-over-the-loop-variable-considered-harmful.aspx.

首先,这是一个很好的方法。

不,不是真的。任意创建线程通常不是一个好主意。最好使用线程池技术。这可以通过以下方式完成ThreadPool.QueueUserWorkItem or the Task class.

其次,每个线程都会获得自己的繁忙等待函数的“副本”。 我的意思是,一个线程可以抢占另一个线程并更改其中的数据吗? 该函数,或者它们每个都获得声明的变量的副本 函数内部。

每个运行实例BusyWait将获得所有局部变量的自己的副本(即page and request)。自从found在非本地范围中声明(大概无论如何),那么它将在所有正在运行的实例之间共享BusyWait。因此,您当前的读取和写入操作found不是线程安全的,因为没有同步机制。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

线程忙等待 的相关文章

  • Paradox 表 - Oledb 异常:外部表不是预期的格式

    我正在使用 Oledb 从 Paradox 表中读取一些数据 我遇到的问题是 当我将代码复制到控制台应用程序时 代码可以工作 但在 WinForms 中却不行 两者都以 x86 进行调试 我实际上只是复制代码 在 WinForms 应用程序
  • 有没有办法使用 i387 fsqrt 指令获得正确的舍入?

    有没有办法使用 i387 fsqrt 指令获得正确的舍入 除了改变精确模式在 x87 控制字中 我知道这是可能的 但这不是一个合理的解决方案 因为它存在令人讨厌的重入型问题 如果 sqrt 操作中断 精度模式将出错 我正在处理的问题如下 x
  • 是否有像 gccxml 这样的用于生成包装器的 C 标头解析器工具?

    我需要为一种新的编程语言编写一些 C 标头包装器 并且想要类似 gccxml 的东西 但不完全依赖 gcc 以及它在 Windows 系统上带来的问题 只需要读C而不是C 只要有完整的文档记录 任何格式的输出都可以 Linux Solari
  • 如何使用 wpf webbrowser 将数据发布到 Web 服务器

    我想从数据库获取数据并使用它来让用户登录到网站 我有一个包含 Web 浏览器控件的 wpf 页面 我有这样的代码 用于将用户登录到用 php 编写的网站
  • 在 MATLAB 中创建共享库

    一位研究人员在 MATLAB 中创建了一个小型仿真 我们希望其他人也能使用它 我的计划是进行模拟 清理一些东西并将其变成一组函数 然后我打算将其编译成C库并使用SWIG https en wikipedia org wiki SWIG创建一
  • 我可以仅在少数情况下关闭模拟吗

    我有一个始终使用模拟的应用程序 但是 当用户以管理员身份登录时 一些操作需要他们写入服务器本身 现在 如果这些用户在实际服务器上没有权限 有些用户没有 则不会让他们写入 我想做的是关闭几个命令的模拟 有没有办法做这样的事情 using Ho
  • 编译器错误“错误:在文件范围内可变地修改了‘字符串’”

    考虑 include
  • 防止GDB中的PLT(过程链接表)断点

    在最新版本的 GDB 中 在库函数调用上设置断点会导致多个实际断点 调用过程链接表 PLT 实际的函数调用 这意味着当调用库函数时 我们每次都会经历两次中断 在以前的 GDB 版本中 只会创建 2 因此您只能得到一次中断 那么问题来了 是否
  • 更改 IdentityServer4 实体框架表名称

    我正在尝试更改由 IdentityServer4 的 PersistedGrantDb 和 ConfigurationDb 创建的默认表名称 并让实体框架生成正确的 SQL 例如 而不是使用实体IdentityServer4 EntityF
  • 如何用 C 语言练习 Unix 编程?

    经过五年的专业 Java 以及较小程度上的 Python 编程并慢慢感觉到我的计算机科学教育逐渐消失 我决定要拓宽我的视野 对世界的一般用处 并做一些 对我来说 感觉更重要的事情就像我真的对机器有影响一样 我选择学习 C 和 Unix 编程
  • 我们可以使用 EWS 托管 API 连接到 Exchange 2016 吗?

    我使用的是 EWS 托管 API 2 2 它的枚举中没有显示 Exchange 版本 2016 我可以看到 Exchange 2013 之前的版本 那么如何连接到 Exchange Server 2016 该 API 是否尚未从 Micro
  • .NET JIT 编译的代码缓存在哪里?

    NET 程序首先被编译为 MSIL 代码 当它被执行时 JIT编译器会将其编译为本机机器代码 我想知道 这些JIT编译的机器代码存储在哪里 它只存储在进程的地址空间中吗 但由于程序的第二次启动比第一次快得多 我认为即使在执行完成后 该本机代
  • #pragma pack(16) 和 #pragma pack(8) 的效果总是相同吗?

    我正在尝试使用来对齐数据成员 pragma pack n http msdn microsoft com en us library 2e70t5y1 28v vs 100 29 aspx 以下面为例 include
  • 纯虚函数可能没有内联定义。为什么?

    纯虚函数是那些虚函数并且具有纯说明符 0 第 10 4 条第 2 款C 03 的内容告诉我们什么是抽象类 顺便说一句 如下 注意 函数声明不能 同时提供纯说明符和定义 尾注 示例 struct C virtual void f 0 ill
  • 在 Java 服务器中验证 Windows 用户

    我正在开发一个用 Java 编写的服务器和一个在同一网络上的 Windows 计算机上运行的客户端 用 Net 编写的桌面应用程序 我希望进行一些基本身份验证 以便服务器可以确定运行客户端的用户的用户名 而不需要用户在客户端中重新输入其 W
  • 如何将对象转换为传递给函数的类型?

    这不会编译 但我想做的只是将对象转换为传递给函数的 t public void My Func Object input Type t t object ab TypeDescriptor GetConverter t ConvertFro
  • System.IO.Compression 和 ZipFile - 提取并覆盖

    我使用标准 VB NET 库来提取和压缩文件 它也可以工作 但是当我必须提取并且文件已经存在时 问题就出现了 我使用的代码 Imports Imports System IO Compression 崩溃时我调用的方法 ZipFile Ex
  • 从有符号字符转换为无符号字符然后再转换回来?

    我正在使用 JNI 并有一个 jbyte 类型的数组 其中 jbyte 表示为有符号字符 即范围从 128 到 127 jbyte 表示图像像素 对于图像处理 我们通常希望像素分量的范围为0到255 因此 我想将jbyte值转换为0到255
  • C# 粘贴到文本框时检查剪贴板中的字符

    有没有一些方法可以在粘贴到文本框 C 之前仅检查剪贴板中的字符 Ctrl V 和右键单击 gt 粘贴 但不使用 MaskedTextbox 在文本框文本更改中添加规则以仅接受数字 例如 private string value privat
  • 无法使 Polly 超时策略覆盖 HttpClient 默认超时

    我正在使用 Polly 重试策略 并且正如预期的那样 在重试过程中HttpClient达到 100 秒超时 我尝试了几种不同的方法来合并 Polly 超时策略 将超时移至每次重试而不是总计 但 100 秒超时仍然会触发 我读过大约 5 个

随机推荐

  • 将 .xls/.csv 文件中的数据读取到 iOS 中

    我是 iOS 新手 正在尝试将电子表格的内容读入 iOS 数组 我使用的电子表格是一个简单的 3 x 2 数组 第一列为数字 第二列为文本 我尝试在 xls xlsx cdv txt unicode 和分隔符 但没有成功 该文件称为 资金
  • 读取 MEX 文件中的 4D 数组

    我在 MATLAB 中有一个 4 维数组 我正在尝试访问 MEX 函数中的数组 下面创建 testmatrix 一个 4 维矩阵 已知数据为uint8 type Create a 4D array 2x 2y rgb 3 framenumb
  • 为什么 "map! :q " 在 vi​​m 中不起作用?

    I input map
  • 好的 iPad SplitViewController 教程吗? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我是 iOS 开发新手 正在尝试学习如何使用 iPad 的 splitViewController 我在
  • 为了安全起见,在注销时禁用浏览器的后退按钮,例如 Yahoo、Gmail 等

    首先 我在 global asax 文件中将会话变量设置为 Session SessionId 如下所示 void Session Start object sender EventArgs e Code that runs when a
  • 控制 .nuspec 中的代码合同引用

    我正在使用代码合同为我的项目生成附属程序集 基本上 它为项目的 MyAssembly dll 创建一个 MyAssembly Contracts dll 它应该放在您的程序集旁边 但不会被任何应用程序引用 它仅由合同工具使用 我试图将其包含
  • ASP.NET (MVC) 路线国际化

    我正在寻找一种在 ASP NET MVC 网站上国际化 本地化路由的解决方案 我偶然发现了这篇博客文章翻译路由 ASP NET MVC 和 Webforms http blog maartenballiauw be post 2010 01
  • 在 Selenium 中,ChromeDriver 可执行文件如何找到 Chrome 浏览器?

    对于Selenium 我们在System setProperty中定义chrome可执行路径 当在 driver get 中传递 URL 且 Chrome 调用时 1 chrome 可执行文件如何知道 Chrome 浏览器的实际安装位 置
  • 使用 mkl_malloc 进行内存对齐

    这个问题可能只是表明我还没有理解 C 中的一些重要内容 Intel Math Kernel 库提供了一种在分配内存时设置内存对齐的方法 另一方面 我只是通过引用将数组传递给 mkl lapack 例程 那么 lapack 例程如何知道数组的
  • 根据另一列修改 data.table 的列并添加新列

    我有一个data table DT有两列 V1 V2 1 1 3 2 2 4 3 3 5 4 2 2 5 3 8 6 1 4 7 2 5 对于每一行 我想采用相同的所有条目V1并添加V2条目然后划分V2按该总和输入并添加到第三列中 例如 在
  • lua http套接字超时

    LuaSocket HTTP 模块文档说可以在 HTTP 连接上设置超时 可以设置以下常量来控制 HTTP 模块的默认行为 PORT 用于连接的默认端口 PROXY 用于连接的默认代理 TIMEOUT 设置所有I O操作的超时时间 USER
  • Git:用一个命令推送到两个存储库

    我想要做git push origin and git push my other remote在同一条线上 可能的 您可以通过为您的应用添加额外的推送 URL 来获得相同的效果origin偏僻的 例如 如果现有遥控器的 URL 如下 gi
  • PyQt5:如何将 QPushButton 连接到插槽?

    好吧 几乎所有教程 可理解的用人类语言编写的文档都是针对 PyQt4 的 但是 PyQt5 改变了整个 将按钮连接到插槽 的工作方式 但我仍然不知道如何做到这一点 我在 QtDesigner 中做了一个快速 gui 并且有一个 QPushB
  • PhantomJS page.open 冻结

    我正在尝试使用 Capture 示例使用 PhantomJS 打开网站 var page require webpage create page open http github com function page render githu
  • 在后台播放音乐:AVAudioSessionInterruptionNotification 未触发

    我的应用程序正在播放背景很好 Pause and play即使我的应用程序是后台使用注册的方法也运行良好AVAudioSessionInterruptionNotification 问题到达场景的步骤 启动我的应用程序 gt 我的应用程序中
  • 生成易于记忆的随机标识符

    与所有开发人员一样 我们在日常工作中不断处理某种标识符 大多数时候 它与错误或支持票有关 我们的软件在检测到错误后 会创建一个包 该包的名称由时间戳和版本号格式化 这是创建合理唯一标识符以避免混淆包的一种廉价方法 例子 错误报告 20101
  • 为什么无法在 android 中包含 iostream?

    已安装 android ndk r7 并尝试编译 cpp 文件 include
  • 如何从 API 获取雅虎天气背景?

    我有一个天气小部件 我需要动态背景 雅虎有天气 API 但我无法找到与天气类型相关的背景图像 https weather yahoo com https weather yahoo com 这可能吗 var url http query y
  • 如何使用计划库运行异步函数?

    我正在使用discord py rewrite 编写一个discord 机器人 并且我想每天在特定时间运行一个函数 我对异步函数完全没有经验 而且我无法弄清楚如何在不使用 await 的情况下运行异步函数 这只是我的一段代码 这就是为什么有
  • 线程忙等待

    基本上 我需要忙着等待一些 html 出现在网页上 我创建了以下代码来忙等我 public void ExecuteBusyWaitThreads foreach Canidate canidate in allCanidates Thre