C# C语言中线程的现代处理方法
今天我想问一下C中线程的使用方法。我知道有很多新词,比如async和Wait,可以帮助处理线程。像这样的东西怎么样: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) { // ... } } 我应该如何处理任务?我是否需要定义异步方法,并在其中使用上述方法?我可以写
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;在异步函数中,使用两个线程合并两个集合?!粗暴地说,你只需要一个线程就可以做到……我没有说我同意这个想法。我只是说我需要这么做。