多线程、定时、异步一些应用。。

Android异步任务与多线程 ANR 的根本原因是:应用未在规定的时间内处理 AMS 指定的任务才会 ANR。另外,人眼可以分辨的时间的160毫秒,超过这个时间就可以感到卡顿,所以要控制好这个时间。 阅读详情

很久不写了,原因是自己很懒。本来打算把前段时间在台湾弄的GoogleMap的总结一下。可是那边用的vs2008回来我的电脑装的都是2005,又懒得把程序转化了。呵~
 最近需要几个功能用到了多线程、异步、等等总结一下。会说的一下几个问题:
1、前台UI响应后开个其他的线程干别的。
2、每隔一段时间做点事
3、非UI线程咋访问UI上的控件啊。
4. Timer类原来有好几个啊。


1.这个是我UI的响应一下后要异步的执行一个东东。多线程、异步看的糊里糊涂,看到一句话说的挺好的“异步是目的,多线程是手段”大有拨开云雾见日出的意思。
这里我用的是线程池。将线程安放在线程池里,需使用ThreadPool.QueueUserWorkItem()方法,该方法的原型如下:
//将一个线程放进线程池,该线程的Start()方法将调用WaitCallback代理对象代表的函数
public static bool QueueUserWorkItem(WaitCallback);
//重载的方法如下,参数object将传递给WaitCallback所代表的方法
public static bool QueueUserWorkItem(WaitCallback, object);
注意: ThreadPool类是一个静态类,你不能也不必要生成它的对象。而且一旦使用该方法在线程池中添加了一个项目,那么该项目将是无法取消的。在这里你无需自己建立线程,只需把你要做的工作写成函数,然后作为参数传递给ThreadPool.QueueUserWorkItem()方法就行了,传递的方法就是依靠WaitCallback代理对象,而线程的建立、管理、运行等工作都是由系统自动完成的,你无须考虑那些复杂的细节问题。

代码如下:    
   private void Send()      
  {            
     ThreadPool.QueueUserWorkItem(new WaitCallback(SendRecord));//无参数                      ThreadPool.QueueUserWorkItem(new WaitCallback(SendRecord),"参数");//有参数。      
  }       
  private void SendRecord(object obj)            //定义这个函数的时候必有object的参数       
  {           
   Thread.Sleep(3000);      
  }
调用这个异步执行的时候就用Send(),而真正要干的代码放在SendRecord()里面。


2. 我还需要每隔一段时间干点啥,这里用的是Threading.timer。 
System.Threading.Timer 是一个使用回调方法的计时器,而且由线程池线程服务,简单且对资源要求不高。  
只要在使用 Timer,就必须保留对它的引用。对于任何托管对象,如果没有对 Timer 的引用,计时器会被垃圾回收。
即使 Timer 仍处在活动状态,也会被回收。当不再需要计时器时,请使用 Dispose 方法释放计时器持有的资源。
使用 TimerCallback 委托指定希望 Timer 执行的方法。计时器委托在构造计时器时指定,并且不能更改。此方法不在创建计时器的线程中执行,而是在系统提供的线程池线程中执行。  
Timer timer = new Timer(timerDelegate, s,1000, 1000);

// 第一个参数:指定了TimerCallback 委托,表示要执行的方法;
// 第二个参数:一个包含回调方法要使用的信息的对象,或者为空引用;
// 第三个参数:延迟时间——计时开始的时刻距现在的时间,单位是毫秒,指定为“0”表示立即启动计时器;
// 第四个参数:定时器的时间间隔——计时开始以后,每隔这么长的一段时间,TimerCallback所代表的方法将被
Timer.Change()方法:修改定时器的设置。(这是一个参数类型重载的方法)
代码如下:
public Form1()
        {
            InitializeComponent();
            TimerExampleState s = new TimerExampleState();
            //创建代理对象TimerCallback,该代理将被定时调用
            TimerCallback timerDelegate = new TimerCallback(CheckStatus);
            //创建一个时间间隔为1s的定时器
            System.Threading.Timer timer = new System.Threading.Timer(timerDelegate, s, 1000, 1000);
            s.tmr = timer;
        }
  void CheckStatus(Object state)
        {
            TimerExampleState s = (TimerExampleState)state;
            s.counter++;
            Console.WriteLine("{0} Checking Status {1}.", DateTime.Now.TimeOfDay, s.counter);

            if (s.counter == 5)
            {
                //使用Change方法改变了时间间隔
                (s.tmr).Change(10000, 2000);
                Console.WriteLine("changed");
            }

            if (s.counter == 10)
            {
                //Console.WriteLine("disposing of timer");
                s.tmr.Dispose();
                s.tmr = null;
            }
        }
class TimerExampleState
    {
        public int counter = 0;
        public System.Threading.Timer tmr;
    }
    这个是在form已出现就开始记时了,实际用的时候就在需要的时候创建timer。
当到达调度时刻时,System.Threading.Timer 将异步调用由TimerCallback参数指定的回调方法。也就是说TimerCallback所指向的方法将在.NET Thread Pool中的工作者线程中执行。


3、以前把一个03的程序改成05的时候就遇到了这种问题。这次我没隔一段时执行的代码中有时候会有个反馈到UI上,就又遇到这个问题。看到大家的解决方案主要有:
第一:
Control.CheckForIllegalCrossThreadCalls = false;
线程开始的时候加这么一句,OK,看不到错误了~
啥都能用了~

第二:
用委托,在05里,每个控件都有个InvokeRequired的属性~
判断一下是不是true,是的话进行Invoke操作的,完事了~
但是第一种方法只是简单的将错误提示禁用了,仍然存在跨线程调用控件的问题。为此可能造成两个线程同时或者循环改变该控件的状态导致线程死锁。
Invoke方法是同步的方法,所以执行过程是有先后顺序的,所以就不会出现那个异常了
代码如下:
 //建立个委托
        private delegate void TestDelegate();

        //实际的操作
        private void returnSchool()
        {
            this.textBox1.Text = "xx"+i.ToString();
        }

        //判断一下是不是该用Invoke滴~,不是就直接返回~
        private void returnCB(TestDelegate myDelegate)
        {
            if (this.InvokeRequired)
            {
                this.Invoke(myDelegate);
            }
            else
            {
                myDelegate();
            }
        }
 //在第一个问题的代码里面调用
  private void SendRecord(object obj)
        {
            Thread.Sleep(3000);
            returnCB(returnSchool);
        }
号外:是不是BackgroundWorker可以完成我上述的两个功能呢?DoWork事件,可以把耗时操作绑定到该事件。RunWorkerCompleted事件,当DoWork事件响应函数结束后该事件被触发,并且可以通过事件参数的e.result得到DoWork中设置的e.result。
有时间去想一想。。


4、
关于C#中timer类  在C#里关于定时器类就有3个  
1.定义在System.Windows.Forms里  
2.定义在System.Threading.Timer类里  
3.定义在System.Timers.Timer类里 
System.Windows.Forms.Timer是应用于WinForm中的,它是通过Windows消息机制实现的,类似于VB或Delphi中的Timer控件,内部使用API  SetTimer实现的。它的主要缺点是计时不精确,而且必须有消息循环,Console  Application(控制台应用程序)无法使用。  
 
System.Timers.Timer和System.Threading.Timer非常类似,它们是通过.NET  Thread  Pool实现的,轻量,计时精确,对应用程序、消息没有特别的要求。System.Timers.Timer还可以应用于WinForm,完全取代上面的Timer控件。它们的缺点是不支持直接的拖放,需要手工编码。

System.Timers.Timer定时器不同于System.Windows.Forms.Timer定时器,System.Timers.Timer定时器的定时事件的响应函数并不是在调用定时器Start方法的线程中去执行。

好吧,简单记录一下,又遇到新问题再去研究~~。。。

Springboot - 多线程执行定时任务 文章目录Springboot - 多线程执行定时任务1、创建一个springboot 应用2、配置线程池3、配置定时任务4、定义定时任务异步多线程执行 Springboot - 多线程执行定时任务 1、创建一个springboot 应用 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apa... 阅读详情

相关推荐

麒麟系统grub被锁怎么办?双密码遗忘救援指南(实测V10 SP3版本)

本文详细介绍了麒麟系统V10 SP3版本在GRUB和root密码双遗忘情况下的救援指南。通过ISO镜像进入救援模式,结合单用户模式操作,实现密码重置与系统权限恢复,特别适用于等保合规环境。

384

定时任务异步多线程执行

【代码】定时任务异步执行。

qq_42892856的博客 707

openvpn 安装 (Alibaba Cloud Linux release 3 (Soaring Falcon))

1.错误:configure: error: libnl-genl-3.0 package not found or too old. Is the development package and pkg-config (/usr/bin/pkg-config) installed?# ta.key在/etc/openvpn/server/目录下可以如下配置,否则需要写完整路径。# 配置账号密码登录客户端需要ca证书(可选)# 证书校验算法 配置上面生成的完整路径。# ca证书 配置上面生成的完整路径。

dubhe_zhao的博客 2148

【SpingBoot定时任务】Spring自带@Scheduled、异步多线程@Async、quartz框架 定时任务示例

springboot定时任务 1、基于注解(@Scheduled) 2、异步多线程使用定时任务 3、使用quartz实现定时任务 使用Springboot整合Quartz定时任务框架

m0_70083523的博客 2108

NVMe与PCIe的完美结合:高速存储背后的技术解析

本文深入解析了NVMe与PCIe技术如何完美结合,实现高速存储性能的飞跃。从机械硬盘到NVMe SSD的进化历程出发,详细介绍了PCIe总线的高带宽优势与NVMe协议的低延迟设计,以及两者协同工作带来的显著性能提升。通过实测数据对比,展示了NVMe SSD在消费级和企业级应用中的卓越表现,并提供了选购与优化建议。

weixin_29216353的博客 376

相机标定原理与张氏标定法

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

heeweii的博客 2280

使用@Schedule注解实现定时任务,多线程执行定时任务,Cron表达式详解

使用@Schedule注解实现定时任务,多线程执行定时任务,Cron表达式详解

樂小伍 1万+

【DDSCAT——离散偶极近似仿真程序04】参数理解和模型设计

在这一部分,我们开始理解DDSCAT程序设计中的一些参数问题。 承接第二部分内容中的ddscat.par文件,我们来聊一聊偶极子、实际体积、有效半径等关键词。 一、偶极子点阵 手册中说,我们需要设计模型(target/目标),它是有偶极子点阵组成的。偶极子,顾名思义,是由一对电荷组成的,但我们不用设计一对,我们设计一个点就行,...

XD_Yangf的博客 7552

SpringBoot 配置定时任务多线程异步执行

SpringBoot使用==@scheduled==执行定时任务是是单线程执行的,如果某个任务阻塞或者执行时间过长,会影响其他定时任务的执行。一般在项目内都需要进行相应的配置来允许定时任务并行执行

爱码猿的博客 2818

告别SquareLine!用免费的NXP GUI-Guider为海思3516AV300开发LVGL界面(附完整移植流程)

本文详细介绍了如何利用免费的NXP GUI-Guider工具为海思Hi3516AV300开发LVGL界面,包括环境配置、代码移植和性能优化等全流程实战指南。特别针对二维码组件缺失等常见问题提供解决方案,帮助开发者零成本构建高效嵌入式GUI系统。

weixin_28292761的博客 415

ollama使用CPU安装qwen-coder模型_并在eclipse中使用ai coder插件_配置本地qwen-coder模型_ollama常用操作记录---AI大模型应用探索0002

文章摘要:作者分享了在Windows 10上安装和使用Ollama模型的过程。尝试了不同规模的qwen-coder模型(7b、1.5b和0.5b),发现7b模型响应极慢(需35分钟),而1.5b模型表现较好(3秒响应)。最终选择1.5b版本用于代码开发辅助,支持多语言自动补全。同时提到在最新版Eclipse中的AIcoder配置问题。文章重点比较了不同模型规模在CPU环境下的实际使用体验和响应速度差异。

添柴程序猿的专栏 679

多线程、定时、异步一些应用

很久不写了,原因是自己很懒。本来打算把前段时间在台湾弄的GoogleMap的总结一下。可是那边用的vs2008回来我的电脑装的都是2005,又懒得把程序转化了。呵~ 最近需要几个功能用到了多线程、异步、等等总结一下。会说的一下几个问题: 1、前台UI响应后开个其他的线程干别的。2、每隔一段时间做点事 3、非UI线程咋访问UI上的控件啊。4. Timer类原来有好几个啊。1.这个是我UI的响应一下后...

weixin_34060299的博客 113

【TC3xx芯片】TC3xx芯片STM介绍

TC3xx芯片STM介绍

qq_36056498的博客 2280

5_2-点赞功能-结合(多线程)or(多线程兼异步)定时持久化到数据库-应用redis的scan方法

记录一下

ws_please的博客 606

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

INetwork 接口和 AsyncTcpServer 上下文,我将详细讲解 Boost.Asio 的高级用法,重点分析其在异步网络编程、多线程、协程、定时器、SSL/TLS 等场景中的应用

INetwork 接口和 AsyncTcpServer 上下文,我将详细讲解 Boost.Asio 的高级用法,重点分析其在异步网络编程、多线程、协程、定时器、SSL/TLS 等场景中的应用。我会提供详细的说明、示例代码、测试方法和 Visual Studio 2022 下的配置步骤(结合 vcpkg 和 CMake),确保代码与你的项目兼容。一、Boost.Asio 高级用法概览Boost.Asio 是一个跨平台的 C++ 库,用于异步 I/O 操作(网络、文件、定时器等)。5. SSL/TLS 支持。

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 761

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Java多线程之定时任务 以及 SpringBoot多线程实现定时任务以及分享动态实现定时任务

Java多线程之定时任务 以及 SpringBoot多线程实现定时任务、以及分享动态实现定时任务 1. 基于单线程的定时器——简单介绍 Timer 中的 schedule 与 scheduleAtFixedRate 2. 基于多线程的定时器——ScheduledExecutorService 3. 基于多线程的定时器(SpringBoot) 4. springboot动态定时任务的实现 5. 附项目工程代码...

@素素~的博客 5678

boost::asio定时器的实现

并发与并行:并发和并行从宏观上来讲都是同时处理多路请求的概念。但并发和并行又有区别,并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔内发生。 1.Timer.1 - 使用同步定时器 所有的Asio类只要简单的包含"asio.hpp"头文件便可使用: #include <boost/asio.hpp> 因为本程序中使用了定时器,我们需要包含相应的的Boost.Date_Time 头文件来处理时间操作: #include <boost/date_...

feikudai8460的博客 1321

53.异步任务和定时任务

上一章节中讲到的发短信和上传文件到云存储为例,这两个操作前者属于时间不确定的操作(因为作为调用者,我们不能确定三方平台响应的时间),后者属于耗时间的操作(如果文件较大或者三方平台不稳定,都可能导致上传的时间较长),很显然,这两个操作都可以做异步化处理。在Web应用中,如果一个请求执行了耗时间的操作或者该请求的执行时间无法确定,而且对于用户来说只需要知道服务器接收了他的请求,并不需要马上得到请求的执行结果,这样的操作我们就应该对其进行异步化处理。,那么将耗时间或执行时间不确定的任务。

优创学社 146

Java常用的多线程编程

以下是Java多线程编程的主要方式及其在企业中的典型应用场景和代码示例:应用场景:继承 类适合一些简单的异步任务,比如在此例中的日志记录。通过创建一个新线程来处理日志记录任务,可以让主线程继续执行而不被阻塞。这种方式在开发快速原型时非常方便,但在实际企业开发中不太推荐,因为每次创建线程会产生一定的开销,且难以管理大量的线程。如果在企业开发中,存在大量并发任务的场景,建议使用线程池()配合实现 接口的方式来管理线程。线程池能够更高效地管理线程的创建、销毁等,避免了频繁创建线程带来的性能问题。示例:异步记录

CJ_L1995的博客 799

springboot 实现异步多线程定时任务

SpringBoot使用Schedule实现异步执行定时任务(多线程)_AlbenXie的博客-优快云博客_springboot 定时器异步执行

Xiaoqiu的博客 632

【SpringBoot】SpringBoot的异步任务、邮件发送、定时任务

本文介绍了SpringBoot中异步任务、邮件发送和定时任务的实现方法。在异步任务部分,通过@Async注解实现后台多线程处理;邮件发送部分详细讲解了SMTP协议配置和JavaMailSender的使用;定时任务部分重点介绍了cron表达式的语法及@Scheduled注解的应用。文中通过具体项目示例,展示了从依赖引入、配置设置到功能测试的完整流程,并提供了常见问题的解决方案(如QQ邮箱授权码设置)和实用工具推荐(cron表达式生成器)。这些功能的实现大幅提升了Web应用的响应速度和自动化能力。

杨DaB的博客 793

java中多线程异步定时任务学习资料

Java8新的异步编程方式 CompletableFuture(一) https://www.jianshu.com/p/dff9063e1ab6 java高并发系统方案解决之一 ,异步请求的重要性 https://blog.youkuaiyun.com/xiaoqiangyonghu/article/details/81000289 Spring Boot---(4)SpringBoot异步处理任务...

az44yao的专栏 1152

定时任务默认单线程,多线程和异步方法的区别

## 定时任务默认单线程,多线程和异步方法的区别 springboot @schedule和@Async定时任务的异步 同步 多任务并发

qq_37029026的博客 449

什么情况下要开启多线程

在这个示例中,我们创建了一个固定大小的线程池,并定义了一个子任务,每个子任务处理数组的一部分。最后,我们等待所有子任务执行完成,然后进行后续操作。为了保持界面的响应性,我们可以使用多线程来实现异步处理:在点击按钮时,启动一个后台线程来执行耗时操作,而主线程负责更新界面,例如显示进度条或者提示信息。我们可以将这个任务分解成多个子任务,每个子任务处理数组的一部分,然后使用多线程来并行执行这些子任务,从而提高计算速度。例如,在搜索引擎中,可以将大型的搜索任务分解成多个子任务,并行处理每个子任务,然后将结果合并。

克里斯蒂亚诺更新的博客 542
上一篇: 用Visual C#实现P2P应用程序
下一篇: ArcGIS Desktop 9.2 破解安装指南
Alexantao
博客等级 码龄19年 86粉丝 185原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值