c#多线程之QueueUserWorkItem[通俗易懂]

c#多线程之QueueUserWorkItem[通俗易懂]编写代码的过程中经常会遇到需要并行操作的时候,此时就需要使用到多线程操作,.net中提供了多种操作多线程的方法,这里介绍最简单的一种—-通过ThreadPool.QueueUserWorkItem。首先看实例代码ThreadPool.QueueUserWorkItem(DoSomeThing);privatevoidDoSomeThing(objectstate)

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

编写代码的过程中经常会遇到需要并行操作的时候,此时就需要使用到多线程操作,.net中提供了多种操作多线程的方法,这里介绍最简单的一种—-通过ThreadPool.QueueUserWorkItem。

首先看实例代码

ThreadPool.QueueUserWorkItem(DoSomeThing);

private void DoSomeThing(object state)
        {
            for (int i = 0; i < int.MaxValue; i++)
            {
                for (int j = 0; j < int.MaxValue; j++)
                {
                    if (j == int.MaxValue - 1)
                    {
                        i++;
                    }
                }
                
            }
        }

其实灰常简单,上面定义了一个测试方法DoSomeThing用于模拟耗时操作,忧郁的表示正常情况应该不会有人会写出这样的方法,当需要异步调用DoSomeThing时,只需要通过调用QueueUserWorkItem 方法,并将DoSomeThing作为回调函数传入,即可异步调用DoSomeThing方法,此时线程池中的某一个线程将会调用DoSomeThing方法。

接着,介绍一下异步操作的取消,即在异步操作的执行过程中,强制停止函数的执行

修改一下上面的DoSomeThing方法如下

private void <span style="font-family: Arial, Helvetica, sans-serif;">DoSomeThing</span>(CancellationToken token, object state)
        {
            for (int i = 0; i < int.MaxValue; i++)
            {
                for (int j = 0; j < int.MaxValue; j++)
                {
                    if (token.IsCancellationRequested)
                    {
                        break;
                    }
                    <pre name="code" class="csharp"><span style="white-space:pre">			</span>if (j == int.MaxValue - 1)
                    {
                        i++;
                    }

} if (token.IsCancellationRequested) { break; } } }


这次的DoSomeThing方法多了一个CancellationToken类型的参数,通过它可以实时探测到方法是否被取消,其使用方法如下:

首先,新建一个CancellationTokenSource对象

 CancellationTokenSource cancelSource = new CancellationTokenSource();

之后将CancellationTokenSource对象的token通过回调方法传入

ThreadPool.QueueUserWorkItem((o) => { DoSomeThing(cancelSource.Token, o); });

因为QueueUserWorkItem的回调函数要求只有一个参数,此处使用了lambda构建了一个含有一个参数的匿名函数,并将cancelSource.Token 传入,就这样,我们新建了一个可取消的异步操作。

当我们需要将异步操作中断时,我们只需要调用一下CancellationTokenSource的cancel方法即可,如下:

cancelSource.Cancel();

在这里CancellationTokenSource的作用其实相当于一个全局状态变量,如果仅仅只是为了实现任务的中断,完全可以使用全局变量来取代,我们可以再次改写DoSomeThing函数如下:

 int statenum=0;
private void DoSomeThing(object state)
        {
            for (int i = 0; i < int.MaxValue; i++)
            {
                for (int j = 0; j < int.MaxValue; j++)
                {
                    if (statenum == 1)
                    {
                        break;
                    }
                    if (j == int.MaxValue - 1)
                    {
                       i++;
                    }
                }
                if (statenum == 1)
                {
                    break;
                }
            }
        }

此时,如果在耗时操作执行过程中将statenum变量置成1,也可实现中断的效果,当然,CancellationTokenSource还有其他的功能,这里就不做深入的探讨了,详情可查阅msdn

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/189723.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 【Qt】Qt的线程(两种QThread类的详细使用方式)「建议收藏」

    【Qt】Qt的线程(两种QThread类的详细使用方式)「建议收藏」Qt提供QThread类以进行多任务处理。与多任务处理一样,Qt提供的线程可以做到单个线程做不到的事情。例如,网络应用程序中,可以使用线程处理多种连接器。QThread继承自QObject类,且提供QMutex类以实现同步。线程和进程共享全局变量,可以使用互斥体对改变后的全局变量值实现同步。因此,必须编辑全局数据时,使用互斥体实现同步,其它进程则不能改变或浏览全局变量值。什么是互斥体?…

  • 浅析Java反序列化漏洞议题

    浅析Java反序列化漏洞议题

    2020年11月20日
  • ROS创建Web代理(Web proxy)「建议收藏」

    ROS创建Web代理(Web proxy)「建议收藏」使用Web代理可以提高网页的访问速度,因为访问的数据会存储在内存或是硬盘中,就会直接从代理服务器中读取。同时,为了提高网络访问的安全性,可以给Web代理服务器设置相应的权限,使它的安全性得到提高。下面就介绍如何在RouterOS中创建Web代理的方法。一、启用Web-Proxy启用路径:IP/Web-Proxy,然后点击WebProx…

  • TCP和UDP协议的区别_tcp和ip是什么意思

    TCP和UDP协议的区别_tcp和ip是什么意思最近在学习WebSocket,了解到它是采用TCP来实现异步通信,全双工.与Http不同的是,Http采用无状态,应答式的响应.因此就想知道TCP,TCP/IP,HTTP,Socket之间到底是有怎样的关联关系和区别,以及全双工通信和半双工通信是如何实现的在网络层.在计算机网络里,有两种常见的参考模型即:OSI参考模型和TCP/IP参考模型。由此可见TCP本身是传输层的协议,…

  • 搭建简单的Eurake服务学习笔记

    搭建简单的Eurake服务学习笔记搭建简单的Eureka服务简单介绍Eureka原理:Eureka集群主要有三个部分Eureka服务器,服务提供者,服务调用者简单的来说就是服务提供者将服务注册到Eureka服务器,服务调用者对其服务进行查找调用。搭建三个项目:创建三个SpringStarterProject类型的项目:[外链图片转存失败(img-aVuiN1EV-1563345334382)(file://…

  • SHFileOperation DeleteFolder

    SHFileOperation DeleteFolder分类:C/C++BOOLDeleteFolder(LPCTSTRlpszPath){  SHFILEOPSTRUCTFileOp; ZeroMemory((void*)&FileOp,sizeof(SHFILEOPSTRUCT));  FileOp.fFlags=FOF_NOCONFIRMATION;  FileO

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号