C# 并行线程调用
2024-09-02 06:44:06
一、异步委托开启线程
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();
}
);
最新文章
- 初学HTML 常见的标签(二) 列表标签
- codeforces 744C Hongcow Buys a Deck of Cards
- SDWebImage
- Pythonn new-style class and old-style class
- django 过滤器 、日期格式化参数
- Docker实践(4)—network namespace与veth pair
- 多线程/进度条应用(progressbar)
- [转]修改maven本地仓库路径
- udp开发-dtd验证,dom解析
- Sql Server 中事务(begin tran/commit tran/rollback tran)的用法
- 解决蛋疼的阿里云单CPU使用率的问题。
- springMVC框架下JQuery传递并解析Json数据
- FPGA合成编码
- JS实现全选,用于界面批量操作向后台传值时使用
- Hibernate一对一主键映射
- Libgdx 1.5.2发布
- jenkins自动化部署vue
- Windows 操作系统
- 项目部署到服务器上之后request.getRemoteAddr()为什么获取的都是本地地址
- Linux下 XordDos(BillGates)木马查杀记录
热门文章
- 十 Restful风格
- 【剑指Offer面试编程题】题目1369:字符串的排列--九度OJ
- SSH Secure Shell 编码设置-----支持中文
- 重大消息:华为笔记本电脑开始用LINUX系统
- 标准模板库中的链表(list)
- Windows中使用QEMU创建树莓派虚拟机
- JS中的鼠标移入移除监控操作
- AJAX封装数据处理简单操作
- Shiro登录身份认证(从SecurityUtils.getSubject().login(token))到Realm的doGetAuthenticationInfo
- app开屏广告