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

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Web安全-一句话木马

    Web安全-一句话木马概述在很多的渗透过程中,渗透人员会上传一句话木马(简称Webshell)到目前web服务目录继而提权获取系统权限,不论asp、php、jsp、aspx都是如此,那么一句话木马到底是什么呢?先来看看最简单的一句话木马:&amp;amp;amp;amp;amp;amp;amp;lt;?php@eval($_POST[‘attack’])?&amp;amp;amp;amp;amp;amp;amp;gt;【基本原理】利用文件上传漏洞,往目标网站中上传一句话木马,然后你就

    2022年5月11日
    36
  • linux修改mysql数据库密码

    linux修改mysql数据库密码linux修改mysql数据库密码

    2022年4月24日
    50
  • Hadoop官方文档中文版3.2.1稳定版

    Hadoop官方文档中文版3.2.1稳定版第一节设置单节点集群目的这个文档描述了如何设置和配置单节点的安装 以便您可以使用 HadoopMapRed 和 Hadoop 分布式文件系统 HDFS 进行快速的简单操作 准备平台支持支持 GNU Linux 作为开发的生产平台 Hadoop 已经在具有 2000 个 GNU Linux 集群进行了演示 Windows 平台同样得到了支持 但是以下的步骤只针对于 Linux 如果想在 Windows 平台设置 Hadoop 请参考 wiki 页面 需要的软件对于 Linux 需要的软件包括 必须安装 Java 推荐

    2025年8月14日
    3
  • cms漏洞扫描_大数据因果溯源分析

    cms漏洞扫描_大数据因果溯源分析CMS系统漏洞分析溯源(第5题)解题思路:登陆页面>>>扫描后台地址>>>登陆地址>>>查看是否可以绕过>>>不可以的话>>>百度管理系统源码>>>分析源码>>>查看登陆页面>>>找到相关php文件>>>admin_name>>>浏览器添加cookie>>>直接访问带有漏洞php文件的页面>>&

    2022年9月27日
    3
  • docker集群软件之fleet安装

    docker集群软件之fleet安装前几天给大家介绍了docker的集群存储软件etcd的安装(地址http://dl528888.blog.51cto.com/2382721/1623746),今天就再给大家介绍集群的控制软件fleet安装。fleet的介绍,info里复制的fleet 是一个通过 Systemd对CoreOS 集群中进行控制和管理的工具。fleet 与 Systemd 之间通过 D-Bus API 进行交互,每个…

    2022年5月1日
    137
  • 这款开源自动化运维平台,让你彻底摆脱人肉运维「建议收藏」

    这款开源自动化运维平台,让你彻底摆脱人肉运维「建议收藏」  大家好,我是小编南风吹,每天推荐一个小工具/源码,装满你的收藏夹,让你轻松节省开发效率,实现不加班不熬夜不掉头发!  今天小编推荐一款面向中小型企业设计的轻量级无Agent的自动化运维平台整合了主机管理、主机批量执行、主机在线终端、文件在线上传下载、应用发布部署、在线任务计划、配置中心、监控、报警等一系列功能。开源协议  使用AGPL-3.0开源许可协议链接地址  公众号【Github导航站】回复关键词【spu】获取git地址特性批量执行:主机命令在线批量执行在线终端:主机支

    2022年5月13日
    51

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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