我想问一下C#中线程的处理方法。我知道像async
和await
这样的新单词可以帮助处理线程。这样的事情怎么样:
Task firstTask = new Task(() =>
{
//some action
});
firstTask.Start();
我应该如何使用Task
?我是否需要定义async
方法并在其中使用上述方法?我可以在里面写await
代替firstTask.wait()
吗?
我现在需要使用两个线程合并两个集合。做上面提到的事情是好方法吗?
答案 0 :(得分:4)
起初Task
并不完全等于线程
Task
是某种工作项,可以异步完成,并具有等待或取消的能力。重要的是要理解,TaskScheduler
决定是否为下一个任务创建新线程,等待某个线程从池中释放或在当前线程中运行
另一方面,如果要确保创建物理线程或从池中获取物理线程,可以手动使用Thread
或ThreadPool
async/await
只不过是Tasks
所以
Thread/Threadpool
是处理物理线程的基础类
Task
是更高级别的库,将异步操作视为单独的工作部分,需要单独完成
async/await
是语法糖,使一些常见任务更容易
答案 1 :(得分:2)
简而言之,Task
是围绕异步执行工作的抽象。现在使用任务是一种推荐的方法。
有时Task
在Thread
上分配了相应的背景ThreadPool
(例如,当您使用Task.Run(() => {Calculate});
运行某些计算时,有时它使用系统功能进行I / O操作异步不在[{1}}上使用其他帖子(例如,当您使用ThreadPool
Method读取文件时)
你的问题中有太多问题,我建议你先去文档:
答案 2 :(得分:1)
我认为如果你从一些文献开始会更好:)
The Basics of Task Parallelism via C#
答案 3 :(得分:0)
注意枚举集合。它们必须是不变的,这意味着当线程在foreach
中时,您无法修改它们,或者该线程(枚举的那个,而不是修改集合的线程)将抛出InvalidOperationException
。这很难调试。
你必须小心谨慎lock()
这样:
lock (coll)
{
foreach (var item in coll)
{
// ...
}
}
同时锁定修改方:
lock (coll)
{
coll.Add(item);
}