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

C# 不同的任务能否同时在同一线程中并发运行?

C# 不同的任务能否同时在同一线程中并发运行?,c#,task,C#,Task,我的情况是,我运行的每个任务都需要一个独占的单例。目前,我使用[ThreadStatic]属性分别保留每个线程的单例实例。但是:我能指望在同一个线程中不会同时运行多个任务吗。。。否则,我的单例将在这些任务之间共享。我假设您谈论的是CPU限制的任务,例如任务。运行和等效任务 TPL可以在各种情况下内联任务。这可能导致多个任务位于同一线程和堆栈上。例如,Task.Wait可以在任务参数尚未启动且调度程序允许的情况下运行该参数 TPL完全充满了这种可重入性,一个看似无害的调用,如Task.Wait或T

我的情况是,我运行的每个任务都需要一个独占的单例。目前,我使用[ThreadStatic]属性分别保留每个线程的单例实例。但是:我能指望在同一个线程中不会同时运行多个任务吗。。。否则,我的单例将在这些任务之间共享。

我假设您谈论的是CPU限制的任务,例如
任务。运行
和等效任务

TPL可以在各种情况下内联任务。这可能导致多个任务位于同一线程和堆栈上。例如,
Task.Wait
可以在任务参数尚未启动且调度程序允许的情况下运行该参数


TPL完全充满了这种可重入性,一个看似无害的调用,如
Task.Wait
TaskCompletionSource.SetResult
可以运行任意代码。在我看来,这是一个非常讨厌的设计缺陷。这会引起很多实际问题。我有时会阅读coreclr/corefx提交日志,我经常会在那里发现由TPL可重入性引起的问题的错误修复。

我建议阅读一下,将预期值作为参数传递给异步方法,而不是使用单例。这在很大程度上取决于
任务的执行方式已完成,这在很大程度上是一个实现细节,故意不属于
任务
合同的一部分<代码>任务
对象是对正在进行的工作的抽象。例如,一个线程运行一些代码,其中包含一个
TaskCompletionSource
对象数组,并将每个对象标记为循环中的完整对象,这是非常有效的。这是否意味着所有这些任务都在该线程上“运行”?这是一个哲学问题。出于好奇,如果每个任务都需要自己的“单例”,为什么不为每个包含自己属性的任务使用单独的类呢?任务起点可以是类中的方法。或者静态字段也被任务之外的方法使用?我明白了,这意味着任务对象可以在同一个线程中并排存在。我想我必须重新考虑我的设计(或者用线程类代替任务类,或者把所有的东西都传递给其他人)。非常感谢。