winform中多线程与定时器冲突

2024-08-30 14:18

本文主要是介绍winform中多线程与定时器冲突,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

我在一个winform项目中同时使用了定时器与多线程。
程序不稳定,有时会弹出异常System.InvalidOperationException。
问题签名:
问题事件名称: CLR20r3
问题签名 01: bscanPlusV3_prepare.exe
问题签名 02: 1.0.0.0
问题签名 03: 59954209
问题签名 04: System.Drawing
问题签名 05: 4.6.1099.0
问题签名 06: 58d873ec
问题签名 07: 307
问题签名 08: 475
问题签名 09: System.InvalidOperationException
OS 版本: 6.1.7601.2.1.0.274.10

感觉像是多线程的使用不规范导致的线程死锁。
但是我的线程中的逻辑只是进行计算,并未操作控件,因此怀疑可能是定时器与多线程冲突导致的死锁。

调查发现timer控件引用的是System.Windows.Forms.Timer类,该类只适合于单线程的环境。
一个 Timer 用于在用户定义的时间间隔引发事件。 此 Windows 计时器专为使用 UI 线程来执行处理的单线程的环境。 它要求用户代码有一个可用的用户界面消息泵,并且始终在同一个线程操作或到另一个线程的调用封送。
https://msdn.microsoft.com/zh-cn/library/system.windows.forms.timer

这时候,需要用System.Windows.Forms.Timer命名空间下的Timer来替代原有的Timer。
VS2012中默认只有System.Windows.Forms.Timer控件,如果要使用System.Timers.Timer的控件需要在工具箱右键单击【选择项】在.NET Framework组件中选择System.Timers命名空间中的Timer控件。
https://msdn.microsoft.com/zh-cn/library/system.timers.timer.aspx

System.Timers.Timer控件的使用方法基本与System.Windows.Forms.Timer相同。问题得到了解决~

这篇关于winform中多线程与定时器冲突的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1121058

相关文章

python多线程并发测试过程

《python多线程并发测试过程》:本文主要介绍python多线程并发测试过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、并发与并行?二、同步与异步的概念?三、线程与进程的区别?需求1:多线程执行不同任务需求2:多线程执行相同任务总结一、并发与并行?1、

Python多进程、多线程、协程典型示例解析(最新推荐)

《Python多进程、多线程、协程典型示例解析(最新推荐)》:本文主要介绍Python多进程、多线程、协程典型示例解析(最新推荐),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定... 目录一、multiprocessing(多进程)1. 模块简介2. 案例详解:并行计算平方和3. 实现逻

使用Python实现一个优雅的异步定时器

《使用Python实现一个优雅的异步定时器》在Python中实现定时器功能是一个常见需求,尤其是在需要周期性执行任务的场景下,本文给大家介绍了基于asyncio和threading模块,可扩展的异步定... 目录需求背景代码1. 单例事件循环的实现2. 事件循环的运行与关闭3. 定时器核心逻辑4. 启动与停

Springboot如何配置Scheduler定时器

《Springboot如何配置Scheduler定时器》:本文主要介绍Springboot如何配置Scheduler定时器问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录Springboot配置Scheduler定时器1.在启动类上添加 @EnableSchedulin

Java使用多线程处理未知任务数的方案介绍

《Java使用多线程处理未知任务数的方案介绍》这篇文章主要为大家详细介绍了Java如何使用多线程实现处理未知任务数,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 知道任务个数,你可以定义好线程数规则,生成线程数去跑代码说明:1.虚拟线程池:使用 Executors.newVir

JAVA封装多线程实现的方式及原理

《JAVA封装多线程实现的方式及原理》:本文主要介绍Java中封装多线程的原理和常见方式,通过封装可以简化多线程的使用,提高安全性,并增强代码的可维护性和可扩展性,需要的朋友可以参考下... 目录前言一、封装的目标二、常见的封装方式及原理总结前言在 Java 中,封装多线程的原理主要围绕着将多线程相关的操

C# winform操作CSV格式文件

《C#winform操作CSV格式文件》这篇文章主要为大家详细介绍了C#在winform中的表格操作CSV格式文件的相关实例,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下... 目录实例一实例效果实现代码效果展示实例二实例效果完整代码实例一实例效果当在winform界面中点击读取按钮时 将csv中

Python中多线程和多进程的基本用法详解

《Python中多线程和多进程的基本用法详解》这篇文章介绍了Python中多线程和多进程的相关知识,包括并发编程的优势,多线程和多进程的概念、适用场景、示例代码,线程池和进程池的使用,以及如何选择合适... 目录引言一、并发编程的主要优势二、python的多线程(Threading)1. 什么是多线程?2.

SpringBoot中使用 ThreadLocal 进行多线程上下文管理及注意事项小结

《SpringBoot中使用ThreadLocal进行多线程上下文管理及注意事项小结》本文详细介绍了ThreadLocal的原理、使用场景和示例代码,并在SpringBoot中使用ThreadLo... 目录前言技术积累1.什么是 ThreadLocal2. ThreadLocal 的原理2.1 线程隔离2

Java多线程父线程向子线程传值问题及解决

《Java多线程父线程向子线程传值问题及解决》文章总结了5种解决父子之间数据传递困扰的解决方案,包括ThreadLocal+TaskDecorator、UserUtils、CustomTaskDeco... 目录1 背景2 ThreadLocal+TaskDecorator3 RequestContextH