C# 并行线程调用
一、异步委托开启线程
Action<int, int> a = add;
a.BeginInvoke(, , null, null);//前两个是add方法的参数,后两个可以为空
Console.WriteLine("main()");
Console.ReadKey(); static void add(int a, int b)
{
Console.WriteLine(a + b);
}
如果不是开启线程,像平常一样调用的话,应该先输出7,再输出main()
二、通过thread类开启线程
new Thread(() =>
{
DTTEST();
})
{ IsBackground = true }.Start();
new Thread(() =>
{
DTTEST();
})
{ IsBackground = true }.Start();
new Thread(() =>
{
DTTEST();
})
{ IsBackground = true }.Start(); Thread.Sleep(); static private void DTTEST()
{ Console.WriteLine($"测试并行调用{DateTime.Now}");
}
或者
Thread thread = new Thread(() =>
{
while (true)
{
Thread.Sleep();
DTTEST();
}
});
thread.Start();
三、通过线程池开启线程
var param = "哈哈";
ThreadPool.QueueUserWorkItem(obj =>
{
// DTTEST(param);
CallbackDemoViod(obj);
}, param);
ThreadPool.QueueUserWorkItem((o) =>
{
DTTEST(param);
}); private static void CallbackDemoViod(object obj)
{
//以下不catch异常就会导致闪退
try
{
Console.WriteLine(obj.ToString());
}
catch (Exception ex)
{ Console.WriteLine(ex);
} }
static private void DTTEST(string a)
{
try
{
Console.WriteLine(a);
}
catch (Exception ex)
{ Console.WriteLine(ex);
}
}
或者
var param = "哈哈";
ThreadPool.QueueUserWorkItem(CallbackDemoViod, param);//这种写法方法体参数必须为object private static void CallbackDemoViod(object obj)
{
//以下不catch异常就会导致闪退
try
{
Console.WriteLine(obj.ToString());
}
catch (Exception ex)
{ Console.WriteLine(ex);
} }
或者
var param = "哈哈";
WaitHandle[] waitHandles = new WaitHandle[]
{
new AutoResetEvent(false),
new AutoResetEvent(false),
new AutoResetEvent(false)
}; ThreadPool.QueueUserWorkItem((o) =>
{
DTTEST(param);
((AutoResetEvent)o).Set();
}, waitHandles[]);
ThreadPool.QueueUserWorkItem((o) =>
{
DTTEST(param);
((AutoResetEvent)o).Set();
}, waitHandles[]);
ThreadPool.QueueUserWorkItem((o) =>
{
DTTEST(param);
((AutoResetEvent)o).Set();
}, waitHandles[]);
WaitHandle.WaitAll(waitHandles); static private void DTTEST(string a)
{
try
{
Console.WriteLine(a);
}
catch (Exception ex)
{ Console.WriteLine(ex);
}
}
4、通过任务开启线程
4.1通过Task
Task wt1 = Task.Run(() =>
{
DTTEST();
});
Task wt2 = Task.Run(() =>
{
DTTEST();
});
Task wt3 = Task.Run(() =>
{
DTTEST();
});
var wtasks = new Task[] { wt1, wt2, wt3 };
Task.WaitAll(wtasks); static private void DTTEST()
{ Console.WriteLine($"测试并行调用{DateTime.Now}");
}
4.2 Task.Factory.StartNew
int val = ;
Task.Factory.StartNew(() =>
{
MessageBox.Show("测试StartNew:无参数");
});
Task.Factory.StartNew(a =>
{
MessageBox.Show("测试StartNew:参数值" + (int)a);
}, val);
5、Invoke实现
Parallel.Invoke(
() =>
{
DTTEST();
},
() =>
{
DTTEST();
},
() =>
{
DTTEST();
},
() =>
{
DTTEST();
},
() =>
{
DTTEST();
}
);
C# 并行线程调用的更多相关文章
- SpringBoot开发案例之多任务并行+线程池处理
前言 前几篇文章着重介绍了后端服务数据库和多线程并行处理优化,并示例了改造前后的伪代码逻辑.当然了,优化是无止境的,前人栽树后人乘凉.作为我们开发者来说,既然站在了巨人的肩膀上,就要写出更加优化的程序 ...
- CUDA编程模型——组织并行线程2 (1D grid 1D block)
在”组织并行编程1“中,通过组织并行线程为”2D grid 2D block“对矩阵求和,在本文中通过组织为 1D grid 1D block进行矩阵求和.一维网格和一维线程块的结构如下图: 其中,n ...
- 并发,并行,线程,进程,GIL锁
1.并发和并行 并发: 同时做某些事,但是强调同一时段做多件事 如:同一路口,发生了车辆要同时通过路面的时间. 并行: 互不干扰的在同一时刻做多件事 如:同一时刻,同时有多辆车在多条车道上跑,即同时发 ...
- 【CUDA 基础】2.3 组织并行线程
title: [CUDA 基础]2.3 组织并行线程 categories: CUDA Freshman tags: Thread Block Grid toc: true date: 2018-03 ...
- C#线程 并行线程
第五部分 并行线程 在本节中,我们将介绍Framework 4.0新增的利用多核处理器的多线程API: 并行LINQ或PLINQ Parallel 类 任务并行性构造 并发集合 自旋锁和自旋等待 ...
- C# 跨线程调用控件
在C# 的应用程序开发中, 我们经常要把UI线程和工作线程分开,防止界面停止响应. 同时我们又需要在工作线程中更新UI界面上的控件, 下面介绍几种常用的方法 阅读目录 线程间操作无效 第一种办法:禁 ...
- 跨线程调用控件之MethodInvoker
原文:http://www.cnblogs.com/cm8448940/archive/2008/07/10/1240045.html 使用到两个控件,一个按钮button1,一个标签label1. ...
- C# 跨线程调用问题
纠结了好久,终于知道了winform和WPF的UI的跨线程调用的解决方法: winform下如果为了省事,可以直接禁用跨线程检查: Control.CheckForIllegalCrossThread ...
- c#中跨线程调用windows窗体控件
c#中跨线程调用windows窗体控件解决. 我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题.然而我们并不能用传统方法来做这个问题,下面我将详细的介绍.首先来 ...
随机推荐
- sqlserver 面试题
1. --是查询A(ID,Name)表中第11至20条记录,ID作为主键可能是不是连续增长的列,完整的查询语句如下: SELECT TOP 10 * FROM dbo.Employee WHERE E ...
- Java程序员所需要掌握的核心知识
[Java学习+面试指南] 一份涵盖大部分Java程序员所需要掌握的核心知识. https://javaguide.cn/ 推荐使用 https://snailclimb.gitee.io/javag ...
- C#委托-事件示例
Program.cs using System;using System.Collections.Generic;using System.Linq;using System.Text;using S ...
- Python学习第八课——函数
python函数(def) def test(x): # x为形参 y = x + 20 return y # def:定义函数的关键字 # test:函数名 # ():内定义参数 # x+=1:代码 ...
- lvextend 扩容后, df -h 看到的却还是原来的大小
[root@stb ~]# df -hFilesystem Size Used Avail Use% Mounted on/dev/mapper/vg_stb-lv ...
- [LuoguP1025][数据加强]数的划分
原题连接:Click 加强数据:Click Solution 参考博客:Click 题目意思非常明确了,这是一道组合数学的题目.我就直接讲dp解法了. dp 题意可以转化为将\(n\)个苹果放进\(k ...
- 防止SQL注入的登录页面
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/T ...
- vue 路由过渡效果(1)
1.html界面 <transition name="slide"> <router-view></router-view> </tran ...
- Timetable CodeForces - 946D (预处理+背包)
题意:n天m节课,最多可以逃k节课,每天在学校待的时间为该天上的第一节课到最后一节课持续的时间.问怎样逃课可以使这n天在学校待的时间最短,输出最短的时间. 分析: 1.预处理出每天逃j节课时在学校待的 ...
- k8s 各种网络方案【转】
网络模型有了,如何实现呢? 为了保证网络方案的标准化.扩展性和灵活性,Kubernetes 采用了 Container Networking Interface(CNI)规范. CNI 是由 Core ...