当前位置: 首页 > news >正文

c 做网站实例soe搜索优化

c 做网站实例,soe搜索优化,滕州做网站哪家好,有合作社做网站得不当我们在使用线程中,你会发现主线结束后子线程的结果才显示出来。现在我要等待所以子线程结束,然后在显示结果,怎么做呢? 方法如下: 1、使用 ManualResetEvent,代码如下: using System.Threadi…

当我们在使用线程中,你会发现主线结束后子线程的结果才显示出来。现在我要等待所以子线程结束,然后在显示结果,怎么做呢?

方法如下:

1、使用 ManualResetEvent,代码如下: 

复制代码
using System.Threading;

namespace ThreadStudy
{
    /// <summary>
    /// 等待所有子线程结束
    /// </summary>
    class StopAllWaitBySubThread
    {
        List<ManualResetEvent> manualEvents = new List<ManualResetEvent>();
        public void Main()
        {
            for (int i = 0; i < 5; i++)
            {
                ManualResetEvent mre = new ManualResetEvent(false);
                manualEvents.Add(mre);
                ThreadPool.QueueUserWorkItem(ThreadMethod, mre);
            }
            WaitHandle.WaitAll(manualEvents.ToArray());
            Console.WriteLine("Thread Finished!");
        }

        private void ThreadMethod(object obj)
        {
            //等待2秒,用于模拟系统在处理事情
            Thread.Sleep(2000);

            ManualResetEvent mre = (ManualResetEvent)obj;
            mre.Set();
            Console.WriteLine("Thread execute");
        }
    }
}
复制代码

 此种方法线程中只传递了信号,那要传递参数怎么办?可以采用类,将信号放在类中来解决,代码如下。

 

复制代码
using System.Threading;

namespace ThreadStudy
{
    /// <summary>
    /// 等待所有子线程结束
    /// </summary>
    class StopAllWaitBySubThread
    {
        List<ManualResetEvent> manualEvents = new List<ManualResetEvent>();
        public void Main()
        {
            for (int i = 0; i < 5; i++)
            {
                ManualResetEvent mre = new ManualResetEvent(false);
                manualEvents.Add(mre);
                Param pra = new Param();
                pra.mrEvent = mre;
                pra.praData = i;
                ThreadPool.QueueUserWorkItem(ThreadMethod, pra);
            }
            WaitHandle.WaitAll(manualEvents.ToArray());
            Console.WriteLine("Thread Finished!");
        }

        private void ThreadMethod(object obj)
        {
            Thread.Sleep(2000);
            Param pra = (Param)obj;
            pra.mrEvent.Set();
            Console.WriteLine("Thread execute at {0}", pra.praData);
        }
    }

    public class Param
    {
        public ManualResetEvent mrEvent;
        public int praData;
    }
}
复制代码

 

2、判断线程数

复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Threading;

namespace ThreadStudy
{
    /// <summary>
    /// 判断当所有子线程执行完毕
    /// </summary>
    class ThreadPoolStop
    {
        public void Main()
        {
            for (int i = 0; i < 5; i++)
            {
                ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadMethod), i);
            }
            int maxWorkerThreads, workerThreads;
            int portThreads;
            while (true)
            {
                /*
                 GetAvailableThreads():检索由 GetMaxThreads 返回的线程池线程的最大数目和当前活动数目之间的差值。
                 而GetMaxThreads 检索可以同时处于活动状态的线程池请求的数目。
                 通过最大数目减可用数目就可以得到当前活动线程的数目,如果为零,那就说明没有活动线程,说明所有线程运行完毕。
                 */
                ThreadPool.GetMaxThreads(out maxWorkerThreads, out portThreads);
                ThreadPool.GetAvailableThreads(out workerThreads, out portThreads);
                if (maxWorkerThreads - workerThreads == 0)
                {
                    Console.WriteLine("Thread Finished!");
                    break;
                }
            }
        }

        private void ThreadMethod(object i)
        {
//模拟程序运行
            Thread.Sleep((new Random().Next(1, 4)) * 1000);
            Console.WriteLine("Thread execute at {0}", i.ToString());
        }
    }
}
复制代码

 

 3、使用Monitor 

复制代码
using System.Threading;

namespace ThreadStudy
{
    class StopAllSubThread
    {
        int _ThreadCount = 5;
        int finishcount = 0;
        object locker = new object();
        public void Main()
        {
            for (int i = 0; i < _ThreadCount; i++)
            {
                Thread trd = new Thread(new ParameterizedThreadStart(ThreadMethod));
                trd.Start(i);
            }
            lock (locker)
            {
                while (finishcount != _ThreadCount)
                {
                    Monitor.Wait(locker);//等待
                }
            }
            Console.WriteLine("Thread Finished!");
        }

        private void ThreadMethod(object obj)
        {
            //模拟执行程序
            Thread.Sleep(3000);
            Console.WriteLine("Thread execute at {0}", obj.ToString());
            lock (locker)
            {
                finishcount++;
                Monitor.Pulse(locker); //完成,通知等待队列,告知已完,执行下一个。
            }
        }
    }
}
复制代码

 

http://www.lbrq.cn/news/2378539.html

相关文章:

  • 深圳网站开发怎么样今日热点新闻排行榜
  • 做网站怎么申请域名seo外包优化服务商
  • 贝智康积分网站开发网站推广优化排名
  • 阿里云上做网站靠谱吗软文
  • 怎么做网站搜索宁波seo外包平台
  • 网站推广的方式?谷歌引擎搜索入口
  • 小程序源码是什么意思seo关键词排名技巧
  • 免费永久网站注册seo广告
  • wordpress调用相关评论上海站群优化公司
  • 唐山高端品牌网站建设百度账号登录官网
  • 赣州网站建设如何阐述网络营销策略的内容
  • 商城网站建设怎么建设深圳全网信息流推广公司
  • B2C营销型网站策划百度技术培训中心
  • 华为荣耀商城官网旗舰店杭州seo排名收费
  • 软件开发中宝鸡seo
  • 医疗室内设计网站推荐陕西seo
  • b2b网站建设方案推广代理平台
  • 北京商城网站开发公司百度竞价推广开户联系方式
  • 自己建设房源网站点石关键词排名优化软件
  • 大安网站建设南昌做seo的公司有哪些
  • 自做网站域名重定向企业推广软文范文
  • 仪征 网站建设小璇seo优化网站
  • 小米路由hd 做网站营销战略有哪些内容
  • 网站建设商业阶段网店推广的作用是什么
  • 宝坻区建设路小学网站东莞网
  • 邢台做网站多少钱关键词优化公司网站
  • 做软测的网站新媒体推广渠道有哪些
  • typecho跟wordpress优化二十条
  • 国外做电商网站有哪些方面如何让百度收录
  • dede网站根目录赣州网站建设公司
  • Docker面试题
  • Kubernetes (k8s)、Rancher 和 Podman 的异同点分析
  • 区块链之Casper协议背景、演变发展、运作机制和潜在风险
  • 爬虫小知识
  • Odoo最佳业务实践:从库存管理重构到全链路协同
  • HDFS基本操作训练(创建、上传、下载、删除)