定时器和线程的问题

2024-01-02

我是一个通过实例学习的 C# 程序员,水平不是很先进,这就是为什么这个问题完全难住了我,无论互联网上有多少信息。

我本质上是在创建一个程序,该程序在计时器上重复轮询网站以获取一些信息。在此过程中,将创建一个 WebBrowser 控件来导航到信息(身份验证所需的)。该程序在启动时运行这一系列事件,然后使用设置为每 10 分钟一次的 System.Timers.Timer(当然,调试时间较少)来执行相同的一系列事件,但当我的 Timer.Elapsed 事件触发该过程时,我得到A:

线程状态异常描述为ActiveX 控件“8856f961-340a-11d0-a96b-00c04fd705a2”无法实例化,因为当前线程不在单线程单元中。

这是我的程序的精简版本。

private void Form1_Load(object sender, EventArgs e)
        {
            GetDataFromWebBrowser();
            Set_Auto_Refresh_Timer();
        }

private void Set_Auto_Refresh_Timer()
        {
            System.Timers.Timer TimerRefresh = new System.Timers.Timer(10000);
            TimerRefresh.Elapsed += new System.Timers.ElapsedEventHandler(TimerRefresh_Elapsed);
            TimerRefresh.AutoReset = true;
            TimerRefresh.Start();
        }    

private void TimerRefresh_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            GetDataFromWebBrowser();
        }

private void GetDataFromWebBrowser()
        {
            WebBrowser wb = new WebBrowser();  <--This is where the error is thrown.

            ...get web data...

        }

我想我已经有足够的代码来描绘这幅画了。正如您所看到的,当它开始创建另一个 WebBrowser 时,它会抛出错误。

我真的很困惑,而且我才刚刚开始了解 Threading 的表面,这可能就是我如此困惑的原因。

//我的解决方案/ 我最终将 WebBrowser 创建移出了该方法,并使其静态化以仅重用 WebBrowser 控件。我还将 System.Timers.Timer 交换为 System.Threading.Timer。似乎解决了问题。


The WebBrowser 的 MSDN 文档 http://msdn.microsoft.com/en-us/library/system.windows.forms.webbrowser.aspx指出:

WebBrowser 类只能在设置为单线程单元 (STA) 模式的线程中使用。要使用此类,请确保您的 Main 方法是用 [STAThread] 属性标记.

另外,改变你的System.Timers.Timer to a System.Windows.Forms.Timer如果您想定期与 UI 控件进行交互。或者,设置同步对象 http://msdn.microsoft.com/en-us/library/system.timers.timer.synchronizingobject.aspx你的财产System.Timers.Timer到父控件以强制计时器调用正确线程上的调用。所有 WinForms 控件只能从同一个且唯一的 UI 线程访问。

.NET 的 BCL 中有三种类型的计时器,每种类型的行为都非常不同。查看这篇 MSDN 文章进行比较:比较 .NET Framework 类库中的计时器类(网络存档) https://web.archive.org/web/20150329101415/https://msdn.microsoft.com/en-us/magazine/cc164015.aspx或这个简要比较表 https://mitch-wheat.blogspot.hr/2010/12/comparing-net-timer-classes.html.

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

定时器和线程的问题 的相关文章

随机推荐

  • auth.User.groups:(fields.E304)“User.groups”的反向访问器与“UserManage.groups”的反向访问器冲突

    在我的 Django 项目中 我有一个user manage app 我创建了一个名为UserManage in my user manage应用程序的model py from django db import models from d
  • 返回 Bash 脚本中的正则表达式匹配项,而不是替换它

    我只想匹配 Bash 脚本中的一些文本 我尝试过使用 sed 但我似乎无法让它只输出匹配项而不是用某些东西替换它 echo E TestT100String sed s 0 9 dontReplace g 哪个会输出TestTdontRep
  • 我如何知道 PDF 页面是彩色还是黑白?

    给定一组 PDF 文件 其中一些页面是彩色的 其余页面是黑白的 是否有任何程序可以找出给定页面中哪些页面是彩色的 哪些页面是黑白的 例如 这在打印论文时很有用 并且只需花费额外的费用来打印彩页 对于考虑双面打印并将适当的黑白页面发送到彩色打
  • R:使用 rvest 包而不是 XML 包从 URL 获取链接

    我使用 XML 包来获取链接this url http www bvl com pe includes empresas todas dat Parse HTML URL v1WebParse lt htmlParse v1URL Read
  • 在圆形叠加层中绘制文本

    我正在尝试在 MKMapView 上绘制一些包含文本的圆形叠加层 我对 MKCircleView 进行了子类化 在其中放置了以下内容 基于this https stackoverflow com questions 4165842 draw
  • 主键违规错误后继续事务

    我正在从日志文件将记录批量插入数据库 有时 每千行中约有 1 行 其中一行违反了主键并导致事务失败 目前 用户必须手动检查导致失败的文件并删除有问题的行 然后才能尝试重新导入 鉴于有数百个这样的文件需要导入 这是不切实际的 我的问题 如何跳
  • 可以使用 CSS 设计 Tkinter GUI 样式吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 如果不是内置功能 是否有附加包允许 Python 的 Tkinter 使用 CSS 如果您可以使用 CSS 则无法以相同的方式设置样式
  • 如何从句子中标记的 word2vec 中获取句子的向量

    我已经使用 word2vec 从大型文档中生成了标记列表的向量 给定一个句子 是否可以从句子中标记的向量得到该句子的向量 有不同的方法来获取句子向量 Doc2Vec 您可以使用 Doc2Vec 训练数据集 然后使用句子向量 Word2Vec
  • Web 配置中的“全局元素‘配置’已被声明”

    我在网络配置中收到烦人的构建警告 我收到了大约 40 条警告Global element element name has already been declared对于我的网络配置中的所有元素 这是针对我在与 MVC 网站相同的解决方案中
  • 当非管理员尝试访问 wp-admin 或 wp-login.php 时,如何将用户重定向到 404 页面未找到错误

    出于安全原因 我试图通过重写链接来限制我的 WordPress 网站管理员和登录面板对非管理员用户的访问 这样如果用户输入http www mysite com wp login php http www mysite com wp log
  • 传入 Apple 推送通知的端口号

    需要在网络上打开哪些网络服务 端口号 传出传入或两者同时打开 iPod touch 才能接收 Apple 推送通知 我知道发送 apns 时要设置的传出端口号 唯一的问题是 在我的学校 几乎每个传出 和传入 端口都被阻止 因此 APN 不起
  • 如何让 mongo 映射器在 Rails 4 中生成 config/mongo.yml 文件

    我正在尝试使用 Mongo Mapper gem 制作一个 Rails 应用程序 我按照 Mongo Mapper 文档中的说明进行操作 链接在这里 Mongo 映射器文档 http mongomapper com documentatio
  • 可排序 + 可拖动演示 - 如何访问放置的项目?

    我有一个可排序的列表 当一个新项目 从可拖动的项目 放入列表中时 我想访问它以对其执行一些操作 这就是我所拥有的 mySortableList sortable receive function event ui alert this is
  • 在 Objective C 类别中使用 Super?

    我想重写 Objective C 类中的一个方法 但我没有源代码 我已经研究过了 看来类别应该允许我这样做 但我想在我的新方法中使用旧方法的结果 使用 super 来获取旧方法的结果 每当我尝试这个时 我的方法都会被调用 但 超级 为零 知
  • Google 脚本,根据上次修改日期删除文件夹中的文件

    我正在尝试创建一个脚本 该脚本每周一次通过共享驱动器运行 并删除过去 90 天内未修改的任何内容 我在这里发现了一些脚本似乎没有按照我的预期工作 我目前拥有的脚本如下 但由于某种原因它似乎不起作用 但似乎应该起作用 它似乎识别了文件 但似乎
  • eval 有什么作用以及为什么它是邪恶的? [复制]

    这个问题在这里已经有答案了 var myString x myObject x 10 value eval myObject myString alert value alert myObject myString 评估是邪恶的 http
  • Excel 多行条件色标

    我有一个电子表格 显示一系列产品的库存数据 我每天都有一个专栏 其中的值显示我的库存水平将如何随着时间的推移而减少 我想使用色标来轻松查看某些产品的库存何时会变少 我的量表的最小值 中值和最大值基于不同列中的值 并且每个产品的值都不同 根据
  • 使用 java 获取便携式设备

    我正在尝试访问设备中的一些文件 具有 Windows CE 其中的应用程序 显示为便携式设备在 windows 7 中使用 java applet 我的设备路径是这样的 Computer Attari s Device myfile txt
  • Doctest 无法识别 __future__.division

    我写了以下文档测试x doctest This is something gt gt gt x 3 4 foo bar something else gt gt gt from future import division gt gt gt
  • 定时器和线程的问题

    我是一个通过实例学习的 C 程序员 水平不是很先进 这就是为什么这个问题完全难住了我 无论互联网上有多少信息 我本质上是在创建一个程序 该程序在计时器上重复轮询网站以获取一些信息 在此过程中 将创建一个 WebBrowser 控件来导航到信