某人(不是我写的)写的异步代码;(还请博友们点评哈~)

              AsyncEventHandler[] asy = new AsyncEventHandler[ResultCount];
IAsyncResult[] asyncResult = new IAsyncResult[ResultCount];
for (int j = ; j < matchedJobs.Length; j++)
{
asy[j] = ThreadJobs;
asyncResult[j] = asy[j].BeginInvoke(dataCollection, matchedJobs[j], jobResults, sLotStepSeq, checkReqResultError[j], executedJobList, null, null);
ThreadJobs(dataCollection, matchedJobs[j], jobResults, sLotStepSeq, checkReqResultError[j], executedJobList);
}
for (int k = ; k < asy.Length; k++)//必须asy全部处理完成才能往下进行
{
asy[k].EndInvoke(asyncResult[k]);
}

我们看线程池

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks; namespace ThreadingLearning
{
class Program
{static void Main(string[] args)
{ //start new .....
//申明一个Action 的委托list
List<Action> actions = new List<Action>()
{
()=>{Console.WriteLine("A-1");},
   ()=>{Console.WriteLine("A-2");},
   ()=>{Console.WriteLine("A-3");},
   ()=>{Console.WriteLine("A-4");} }; //遍历输出结果;
foreach (var action in actions)
{ ThreadPool.QueueUserWorkItem(p => action(), null);
} Console.ReadLine(); }
}
}

结果:

A-1 过了就是A-4 则说明主线程(for循环)的执行速度,比子线程执行的速度快,或者说优先级高。(不一定,总体是这样的)

网上还看到了这样的结果:

解释出现这样现象的原因:

醒悟过来:由于被置于ThreadPool中的操作时异步的,还没有来的执行的时候,ation已经被for循环改变,永远是同一个ation对象!

  出现的情况,那要根据个人的cpu情况了,

解决方法一:Thread.Sleep(N)

  //遍历输出结果;
foreach (var action in actions)
{
Thread.Sleep();
//Thread.Sleep(N)是对当前线程阻塞一定时间,
//那这个处理不论是主线程还是线程池中的线程都是有效果的,
//至少为线程池中的线程的请求与启动赢得了时间
ThreadPool.QueueUserWorkItem(p => action(), null);
}

解决方法二:使用中间变量;

           foreach (var action in actions)
{
var temp = action;
ThreadPool.QueueUserWorkItem(p => temp(), null);
}

下面这种情况会出现bug;会出现如图二的bug,

 //遍历输出结果;
var action=actions[]; //先随便赋一个值,
foreach ( var v in actions)
{
action = v;
ThreadPool.QueueUserWorkItem(state => action(), null);
}

结果:bug

net异步线程注意事项的更多相关文章

  1. SpringBoot 异步线程简单三种样式

    引用:在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的:但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务,其实,在Spring 3.x ...

  2. 卸载AppDomain动态调用DLL异步线程执行失败

    应用场景 动态调用DLL中的类,执行类的方法实现业务插件功能 使用Assembly 来实现 但是会出现逻辑线程数异常的问题 使用AppDomain 实现动态调用,并卸载. 发现问题某个插件中开启异步线 ...

  3. net异步线程获取返回值的三种方式

    方式一:endInvoke using System; using System.Collections.Generic; using System.Text; using System.Thread ...

  4. AsyncTask实现异步线程通信

    AsyncTask是Android1.5开始提供的一个封装了Thread与Handler可以实现异步线程的简单方式,不需要再自己实现子线程,然后在主线程处接受数据. 因为AsyncTask是用线程池, ...

  5. 安卓 异步线程更新Ui

    异步跟新UI: 1.handler+Thread(runnable):如果handler和Thread都写在了一个Java文件中,就不说了,如果runnable定义在了一个单独的类文件中,可以通过在构 ...

  6. 关于GCD同步组实现多个异步线程的同步执行中的注意点

    在App开发中经常会遇到多个线程同时向服务器取数据, 如果每个线程取得数据后都去刷新UI会造成界面的闪烁 也有可能出现部分数据还没有获取完毕造成程序crash 之前在网上看到很多是利用dispatch ...

  7. 线程池内的异步线程创建UI控件,造成UI线程卡死无响应的问题分析

    winform应用在使用一段时间后,切换到其他系统或者打开word.excel文档,再切换回winform应用时,系统有时出现不响应的现象.有时在锁屏后恢复桌面及应用时也发生此问题. 经微软支持确认, ...

  8. Eclipse RCP中超长任务单线程,异步线程处理

    转自:http://www.blogjava.net/mydearvivian/articles/246028.html 在RCP程序中,常碰到某个线程执行时间比较很长的情况,若处理不好,用户体验度是 ...

  9. C# 在异步线程操作类的变量

    如下代码: public partial class Form1 : Form { public Form1() { InitializeComponent(); } public string Me ...

随机推荐

  1. Idea_idea代码调试debug篇

    主要看图,看图一目了然. 断点的设定和eclipse一样,只要点一下就可以,下面是我设定的几个断点,再下面的三个窗口是用来调试代码的,这个和eclipse类似 调试常用的快捷键 ? 1 2 3 4 5 ...

  2. (转载)读取xml中的指定节点的值

            /// <summary>         /// 读取xml中的指定节点的值        /// </summary>         private st ...

  3. Vim 学习资料

    VIM中文手册 简明 Vim 练级攻略 所需即所获:像 IDE 一样使用 vim

  4. SQL Server 中的触发器(trigger)

    SQL Server 触发器 触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程.触发器主要是通过事件进行触发被自动调用执行的.而存储过程可以通过存储过程的名称被调用. Ø 什么是触发器 ...

  5. spark-submit [options]

    执行时需要传入的参数说明如下: Usage: spark-submit [options] <app jar | python file> [app options] 参数名称 含义 -- ...

  6. thinkphp框架中session常识

    在看别人代码时候,发现他,在tp框架中使用session没有些session_start();然后我去查看了手册初始化设置方法 无需手动调用,在App类的初始化工作结束后会自动调用,通常项目只需要配置 ...

  7. [转]用Linq取CheckBoxList選取項目的值

    本文转自:http://www.dotblogs.com.tw/hatelove/archive/2011/11/17/linq-checkboxlist-items-selected-values. ...

  8. 让Win8自动登录免输入密码的小技巧

    按Win+R键,输出“netplwiz”,单击“确定”,弹出“用户帐户”窗口.将第一个画框上的勾选去掉——应用——弹出自动登录输入你的密码——确定——确定完成.重启看看电脑是不是不用输入密码也可以自动 ...

  9. ubuntu&FAQ

        转自-笨小孩 查看进程: ,ps -e 命令 ,feng@feng:~$ sudo netstat -antup Active Internet connections (servers an ...

  10. Yii源码阅读笔记(二)

    接下来阅读BaseYii.php vendor/yiisoft/yii2/BaseYii.php—— namespace yii; use yii\base\InvalidConfigExceptio ...