C#中线程的现代方法

时间:2014-01-29 10:50:34

标签: c# multithreading asynchronous

我想问一下C#中线程的处理方法。我知道像asyncawait这样的新单词可以帮助处理线程。这样的事情怎么样:

Task firstTask = new Task(() =>
{
    //some action
});
firstTask.Start();

我应该如何使用Task?我是否需要定义async方法并在其中使用上述方法?我可以在里面写await代替firstTask.wait()吗?

我现在需要使用两个线程合并两个集合。做上面提到的事情是好方法吗?

4 个答案:

答案 0 :(得分:4)

起初Task并不完全等于线程

Task是某种工作项,可以异步完成,并具有等待或取消的能力。重要的是要理解,TaskScheduler决定是否为下一个任务创建新线程,等待某个线程从池中释放或在当前线程中运行

另一方面,如果要确保创建物理线程或从池中获取物理线程,可以手动使用ThreadThreadPool

async/await只不过是Tasks

周围的语法糖

所以

Thread/Threadpool是处理物理线程的基础类

Task是更高级别的库,将异步操作视为单独的工作部分,需要单独完成

async/await是语法糖,使一些常见任务更容易

答案 1 :(得分:2)

简而言之,Task是围绕异步执行工作的抽象。现在使用任务是一种推荐的方法。

有时TaskThread上分配了相应的背景ThreadPool(例如,当您使用Task.Run(() => {Calculate});运行某些计算时,有时它使用系统功能进行I / O操作异步在[{1}}上使用其他帖子(例如,当您使用ThreadPool Method读取文件时)

你的问题中有太多问题,我建议你先去文档:

答案 2 :(得分:1)

答案 3 :(得分:0)

注意枚举集合。它们必须是不变的,这意味着当线程在foreach中时,您无法修改它们,或者该线程(枚举的那个,而不是修改集合的线程)将抛出InvalidOperationException。这很难调试。

你必须小心谨慎lock()这样:

lock (coll)
{
    foreach (var item in coll)
    {
        // ...
    }
}

同时锁定修改方:

lock (coll)
{
    coll.Add(item);
}