Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.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#_.net_Multithreading_Task_Threadpool - Fatal编程技术网

C# 任务的同步上下文

C# 任务的同步上下文,c#,.net,multithreading,task,threadpool,C#,.net,Multithreading,Task,Threadpool,一篇关于SynchronizationContext的评论指出,SynchronizationContext决定了任务是作为单独的线程运行还是在一个线程上运行,但在任何回答中都没有提到这一点,也没有提到任务何时会在单独的线程上并行运行,或者只是在同一个线程上运行,但在等待IO时可能会在它们之间共享工作 特别是,我想在这个上下文中比较线程对象和任务对象,无论它们的行为相同还是不同 如何异步和等待连接或不连接到这将是有益的 举个例子,假设我有两个动作: f:忙非IO循环一秒钟 g:睡一会儿 让我们假

一篇关于SynchronizationContext的评论指出,SynchronizationContext决定了任务是作为单独的线程运行还是在一个线程上运行,但在任何回答中都没有提到这一点,也没有提到任务何时会在单独的线程上并行运行,或者只是在同一个线程上运行,但在等待IO时可能会在它们之间共享工作

特别是,我想在这个上下文中比较线程对象和任务对象,无论它们的行为相同还是不同

如何异步和等待连接或不连接到这将是有益的

举个例子,假设我有两个动作:

f:忙非IO循环一秒钟 g:睡一会儿

让我们假设我有一个CPU,它的核心数量非常多

给定以下代码,无论是h=f还是h=g,运行yes都需要将近1秒的时间

Thread x1 = new Thread(h);
Thread x2 = new Thread(h);
Thread x3 = new Thread(h);
Thread x4 = new Thread(h);
Thread x5 = new Thread(h);
x1.Start();
x2.Start();
x3.Start();
x4.Start();
x5.Start();
x1.Join();
x2.Join();
x3.Join();
x4.Join();
x5.Join();
假设我对任务做了类似的事情:

Task x1 = new Task(h);
Task x2 = new Task(h);
Task x3 = new Task(h);
Task x4 = new Task(h);
Task x5 = new Task(h);
x1.Start();
x2.Start();
x3.Start();
x4.Start();
x5.Start();
x1.Wait();
x2.Wait();
x3.Wait();
x4.Wait();
x5.Wait();
对于h=f和h=g的情况,此任务代码运行需要多长时间,如果需要,什么情况会产生差异,我如何控制它们

特别是,我想在这个上下文中比较线程对象和任务对象,无论它们的行为相同还是不同

它们与您的代码几乎相同

有:委托任务,运行代码;和承诺任务,这代表了

使用和创建的任务是。使用async和Wait创建的任务是

委托任务只是表示要运行的代码。它们与线程不同,但它们确实在线程上运行。使用示例代码,“开始”将在TaskScheduler.Current上启动这些任务,这可能与TaskScheduler.Default相同,这意味着它们将在线程池上运行。由于假设内核的数量非常多,那么您的委托任务代码基本上与手动线程代码相同,只是它们运行在线程池线程上,而不是您自己的线程上

另一方面,使用任务构造函数和Start是非常低级的,它甚至没有任何用例;您永远不应该使用任务构造函数,因为无论您尝试做什么,总会有更好的解决方案。查看中的高级基本体。在您的情况下,您可以使用以下工具执行相同的操作:


评论不用于扩展讨论;这段对话已经结束。
Parallel.Invoke(h, h, h, h, h);