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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • simhash是什么_批复的适用情况

    simhash是什么_批复的适用情况需求是这样的:给出一个文档集合,以及一个领域概念集合,要求根据这些领域概念计算文档的相似性。首先想到的是利用余弦相似性计算。起初得到的集合有大概几万篇文档,如果对每对文档进行余弦相似度计算,会导致时间复杂度较高,于是发现了Simhash方法。由于已经给出了用于计算哈希值的关键词(即这些领域概念),就省去了对文章进行分词的步骤。每篇文档都用其领域概念列表计算出文档的哈希值,并使用这些

    2022年10月1日
    0
  • setInterval与clearInterval

    setInterval与clearIntervalsetInterval 与 clearInterva 定义和用法语法返回值实例 setInterval 定义和用法 setInterval 方法可按照指定的周期 以毫秒计 来调用函数或计算表达式 setInterval 方法会不停地调用函数 直到 clearInterva 被调用或窗口被关闭 由 setInterval 返回的 ID 值可用作 clearInterva 方法的参数 语法 setInterval code millisec lang 参数描述

    2025年6月7日
    0
  • DNS服务器fe80_无法访问dns域名服务器

    DNS服务器fe80_无法访问dns域名服务器服务器dns地址fec0内容精选换一换Atlas200DK开发者板支持通过USB端口或者网线与Ubuntu服务器进行连接,连接示例图如图1所示。Atlas200DK连接Ubuntu服务器有以下场景:使用USB连接线通过USB端口与Ubuntu服务器直连,请参考通过USB端口直连Ubuntu服务器。此种场景下,Atlas200DK不方便接入网络,仅适用于与Ubunt创建子网。您可以在A…

    2022年8月11日
    17
  • java修改session默认过期时间「建议收藏」

    java修改session默认过期时间「建议收藏」java修改session默认过期时间    程序中session都有一个默认的过期时间,其中tomcat中的默认时间为30分钟,根据需要我们可以去手动设置session的过期时间,以下是设置session的过期时间的三个方法:  1.在tomcat–>conf–>conf/web.xm中的中设置:       30  

    2022年7月16日
    68
  • CSS行高line-height的理解建议收藏

    一、行高的字面意思“行高“顾名思义指一行文子的高度。具体来说是指两行文子间基线间的距离。基线是在英文字母中用到的一个概念,我们刚学英语的时候使用到的那个英语本子每行有4条线,其中底部第二条线就是基线,

    2021年12月20日
    53
  • 单片机入门知识

    作为一个大三老狗,才开始单片机入门,晚是晚了点,但是由于知识体系比大一大二稍加完善,所以看问题也相对于更加全面,所以写下学习笔记作为分享,当然,知识水平有限,希望大神们能够给出修改意见。学习参考书:51单片机C语言教程(郭天祥)学习芯片:STC89C52第一篇单片机入门知识:基础知识整合:单片机概念:单片机就是指的一块集成芯片,上面集成了微处理器、存储器及各种输入/输出接口。单片

    2022年4月4日
    38

发表回复

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

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