net异步线程注意事项
某人(不是我写的)写的异步代码;(还请博友们点评哈~)
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异步线程注意事项的更多相关文章
- SpringBoot 异步线程简单三种样式
引用:在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的:但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务,其实,在Spring 3.x ...
- 卸载AppDomain动态调用DLL异步线程执行失败
应用场景 动态调用DLL中的类,执行类的方法实现业务插件功能 使用Assembly 来实现 但是会出现逻辑线程数异常的问题 使用AppDomain 实现动态调用,并卸载. 发现问题某个插件中开启异步线 ...
- net异步线程获取返回值的三种方式
方式一:endInvoke using System; using System.Collections.Generic; using System.Text; using System.Thread ...
- AsyncTask实现异步线程通信
AsyncTask是Android1.5开始提供的一个封装了Thread与Handler可以实现异步线程的简单方式,不需要再自己实现子线程,然后在主线程处接受数据. 因为AsyncTask是用线程池, ...
- 安卓 异步线程更新Ui
异步跟新UI: 1.handler+Thread(runnable):如果handler和Thread都写在了一个Java文件中,就不说了,如果runnable定义在了一个单独的类文件中,可以通过在构 ...
- 关于GCD同步组实现多个异步线程的同步执行中的注意点
在App开发中经常会遇到多个线程同时向服务器取数据, 如果每个线程取得数据后都去刷新UI会造成界面的闪烁 也有可能出现部分数据还没有获取完毕造成程序crash 之前在网上看到很多是利用dispatch ...
- 线程池内的异步线程创建UI控件,造成UI线程卡死无响应的问题分析
winform应用在使用一段时间后,切换到其他系统或者打开word.excel文档,再切换回winform应用时,系统有时出现不响应的现象.有时在锁屏后恢复桌面及应用时也发生此问题. 经微软支持确认, ...
- Eclipse RCP中超长任务单线程,异步线程处理
转自:http://www.blogjava.net/mydearvivian/articles/246028.html 在RCP程序中,常碰到某个线程执行时间比较很长的情况,若处理不好,用户体验度是 ...
- C# 在异步线程操作类的变量
如下代码: public partial class Form1 : Form { public Form1() { InitializeComponent(); } public string Me ...
随机推荐
- Idea_idea代码调试debug篇
主要看图,看图一目了然. 断点的设定和eclipse一样,只要点一下就可以,下面是我设定的几个断点,再下面的三个窗口是用来调试代码的,这个和eclipse类似 调试常用的快捷键 ? 1 2 3 4 5 ...
- (转载)读取xml中的指定节点的值
/// <summary> /// 读取xml中的指定节点的值 /// </summary> private st ...
- Vim 学习资料
VIM中文手册 简明 Vim 练级攻略 所需即所获:像 IDE 一样使用 vim
- SQL Server 中的触发器(trigger)
SQL Server 触发器 触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程.触发器主要是通过事件进行触发被自动调用执行的.而存储过程可以通过存储过程的名称被调用. Ø 什么是触发器 ...
- spark-submit [options]
执行时需要传入的参数说明如下: Usage: spark-submit [options] <app jar | python file> [app options] 参数名称 含义 -- ...
- thinkphp框架中session常识
在看别人代码时候,发现他,在tp框架中使用session没有些session_start();然后我去查看了手册初始化设置方法 无需手动调用,在App类的初始化工作结束后会自动调用,通常项目只需要配置 ...
- [转]用Linq取CheckBoxList選取項目的值
本文转自:http://www.dotblogs.com.tw/hatelove/archive/2011/11/17/linq-checkboxlist-items-selected-values. ...
- 让Win8自动登录免输入密码的小技巧
按Win+R键,输出“netplwiz”,单击“确定”,弹出“用户帐户”窗口.将第一个画框上的勾选去掉——应用——弹出自动登录输入你的密码——确定——确定完成.重启看看电脑是不是不用输入密码也可以自动 ...
- ubuntu&FAQ
转自-笨小孩 查看进程: ,ps -e 命令 ,feng@feng:~$ sudo netstat -antup Active Internet connections (servers an ...
- Yii源码阅读笔记(二)
接下来阅读BaseYii.php vendor/yiisoft/yii2/BaseYii.php—— namespace yii; use yii\base\InvalidConfigExceptio ...