Multithreading 什么';我的System.Threading.Tasks.Task使用有什么问题?

Multithreading 什么';我的System.Threading.Tasks.Task使用有什么问题?,multithreading,c#-4.0,Multithreading,C# 4.0,显然,task#1、#2、#3从未开始,但此系统的.Status。Threading.Tasks.task-实例告诉我们它正在运行。 那么这里的问题是什么呢?我想说,在DoSomethingInternal中的某个地方出现了死锁,我觉得您的输出远远不是线性的 当我运行代码时,对这两种记录器方法使用Console.WriteLine,输出为: translation: task #1 = id 9 translation: task #2 = id 5 translation: task #3 =

显然,task#1、#2、#3从未开始,但此
系统的
.Status
。Threading.Tasks.task
-实例告诉我们它正在运行。
那么这里的问题是什么呢?

我想说,在
DoSomethingInternal
中的某个地方出现了死锁,我觉得您的输出远远不是线性的

当我运行代码时,对这两种记录器方法使用
Console.WriteLine
,输出为:

translation: task #1 = id 9
translation: task #2 = id 5
translation: task #3 = id 2
translation: task #4 = id 3
translation: task #5 = id 7
translation: task #6 = id 8
translation: task #7 = id 1
translation: task #8 = id 10
DoSomethingInternal / task #8 - id 10
DoSomethingInternal / task #7 - id 1
DoSomethingInternal / task #6 - id 8
DoSomethingInternal / task #5 - id 7
DoSomethingInternal / task #4 - id 3
--------------------- 12/01/2011 08:29:57
task #1: Running
task #2: Running
task #3: Running
task #4: RanToCompletion
task #5: RanToCompletion
task #6: RanToCompletion
task #7: RanToCompletion
task #8: RanToCompletion
--------------------- 12/01/2011 08:29:58
task #1: Running
task #2: Running
task #3: Running
task #4: RanToCompletion
task #5: RanToCompletion
task #6: RanToCompletion
task #7: RanToCompletion
task #8: RanToCompletion
--------------------- 12/01/2011 08:29:59
task #1: Running
task #2: Running
task #3: Running
task #4: RanToCompletion
task #5: RanToCompletion
task #6: RanToCompletion
task #7: RanToCompletion
task #8: RanToCompletion

通过将同一对象锁定在
DoSomething
DoSomethingInternal
中,我可以获得与您类似的输出,尽管在我的例子中,前7个没有完成。在
线程池上运行
DoSomething
线程

无法确认“我的盒子”上的行为,您是否尝试替换Logger.DebugFormat(“DoSomethingInternal/task{0}-id{1}”、task.CurrentId、this.id);用更简单的东西。e、 调试,写线?可能您的记录器不处理多线程access@Dominik我正在使用log4net。。。但我会试试看@Dominik不,没有改变任何事…:(主要问题不是这些方法没有完成,它们甚至没有被输入…@Andreas据我所知,一些任务将被批处理到同一个线程上。如果该线程被阻塞,这些任务将永远不会执行。感谢您的输入…但是如果我没有任何锁怎么办?很抱歉,我最后的评论没有什么意义感觉。如果有4个线程可用,其中一个正在运行DoSomething,前三个任务将被放到其他可用线程上。如果第一个线程上有锁阻止它们进入(甚至可能在日志记录中),它们将永远坐在那里。看起来Task.WaitAll(任务)将控制它正在等待的任务(因为没有必要它什么都不做)因此它会处理剩下的7个任务。前三个任务不能这样做,因为它们已经被分配给了其他线程。所以…你最初的想法是
一些任务将被批处理到同一个线程上
一针见血…实际上我的示例的范围是“另一个任务”在另一个任务中,我调用了
static Foo.FooMethod
,但实际上是在
cctor
中进行工作。这打破了链条-不知何故,新的
ThreadPool
正在明确地等待
static Foo.FooMethod
(其中没有代码)-但是工作是在
cctor Foo
中完成的…感谢buddy的提示!
translation: task #1 = id 9
translation: task #2 = id 5
translation: task #3 = id 2
translation: task #4 = id 3
translation: task #5 = id 7
translation: task #6 = id 8
translation: task #7 = id 1
translation: task #8 = id 10
DoSomethingInternal / task #8 - id 10
DoSomethingInternal / task #7 - id 1
DoSomethingInternal / task #6 - id 8
DoSomethingInternal / task #5 - id 7
DoSomethingInternal / task #4 - id 3
--------------------- 12/01/2011 08:29:57
task #1: Running
task #2: Running
task #3: Running
task #4: RanToCompletion
task #5: RanToCompletion
task #6: RanToCompletion
task #7: RanToCompletion
task #8: RanToCompletion
--------------------- 12/01/2011 08:29:58
task #1: Running
task #2: Running
task #3: Running
task #4: RanToCompletion
task #5: RanToCompletion
task #6: RanToCompletion
task #7: RanToCompletion
task #8: RanToCompletion
--------------------- 12/01/2011 08:29:59
task #1: Running
task #2: Running
task #3: Running
task #4: RanToCompletion
task #5: RanToCompletion
task #6: RanToCompletion
task #7: RanToCompletion
task #8: RanToCompletion
translation: task #1 = id 0
DoSomethingInternal / task #1 - id 0
translation: task #2 = id 1
translation: task #3 = id 2
DoSomethingInternal / task #2 - id 1
DoSomethingInternal / task #3 - id 2
DoSomethingInternal / task #4 - id 3
translation: task #4 = id 3
translation: task #5 = id 4
DoSomethingInternal / task #5 - id 4
DoSomethingInternal / task #6 - id 5
translation: task #6 = id 5
translation: task #7 = id 6
translation: task #8 = id 7
DoSomethingInternal / task #7 - id 6
DoSomethingInternal / task #8 - id 7
translation: task #9 = id 8
translation: task #10 = id 9
DoSomethingInternal / task #10 - id 9
DoSomethingInternal / task #9 - id 8
ready