Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C语言中线程的现代处理方法_C#_Multithreading_Asynchronous - Fatal编程技术网

C# C语言中线程的现代处理方法

C# C语言中线程的现代处理方法,c#,multithreading,asynchronous,C#,Multithreading,Asynchronous,今天我想问一下C中线程的使用方法。我知道有很多新词,比如async和Wait,可以帮助处理线程。像这样的东西怎么样: Task firstTask = new Task(() => { //some action }); firstTask.Start(); lock (coll) { foreach (var item in coll) { // ... } } 我应该如何处理任务?我是否需要定义异步方法,并在其中使用上述方法?我可以写

今天我想问一下C中线程的使用方法。我知道有很多新词,比如async和Wait,可以帮助处理线程。像这样的东西怎么样:

Task firstTask = new Task(() =>
{
    //some action
});
firstTask.Start();
lock (coll)
{
    foreach (var item in coll)
    {
        // ...
    }
}
我应该如何处理任务?我是否需要定义异步方法,并在其中使用上述方法?我可以写wait而不是firstTask吗


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

第一个任务并不完全等同于线程

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

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

async/await只不过是一种围绕任务的语法糖

所以

Thread/Threadpool是处理物理线程的底层类

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


async/await是语法糖,它使一些常见任务变得更简单

请注意枚举集合。它们必须是不变的,这意味着当一个线程在foreach中时,不能修改它们,或者正在枚举而不是修改集合的线程将抛出InvalidOperationException。这是很难调试的

在这种情况下,你必须小心上锁:

Task firstTask = new Task(() =>
{
    //some action
});
firstTask.Start();
lock (coll)
{
    foreach (var item in coll)
    {
        // ...
    }
}
同时锁定修改侧:

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

我认为最好从一些文学作品开始:

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

有时任务在线程池上分配了相应的后台线程,例如,当您使用Task.run=>{Calculate};,运行某些计算时;,有时,它使用系统功能异步执行I/O操作,而不消耗线程池上的额外线程,例如,当您使用FileStream.ReadAsync读取文件时

你的问题问得太多了,我建议你先看一下文档:


对于处理集合,您应该查看PLINQ=await Task.Factory.StartNew=>yourfunch;在异步函数中,使用两个线程合并两个集合?!粗暴地说,你只需要一个线程就可以做到……我没有说我同意这个想法。我只是说我需要这么做。