2017-07-28 133 views
-1

我创建了一个任务并为task.wait()方法提供了等待时间,但是任务没有等到所提供的时间,并且在等待时间之前返回完成状态为false。任务没有等到等待时间

using System; 
using System.Threading; 
using System.Threading.Tasks; 

class Test 
{ 
    static void Main(string[] args) 
    { 
     for(int i = 0 ; i < 10 ; i++) 
     { 
      int localValue = i; 
      Task.Factory.StartNew(() => ProcessTask(localValue)); 
     } 
     Console.ReadKey(); 
    } 

    private static void ProcessTask(int thread) 
    { 
     var task = Task<int>.Factory.StartNew(() => GetSomeValue()); 
     task.Wait(2000); 

     if(task.IsCompleted) 
     { 
      Console.WriteLine("Completed Thread: " + thread); 
     } 
     else 
     { 
      Console.WriteLine("Not Completed Thread " + thread); 
     } 
    } 

    private static int GetSomeValue() 
    { 
     Thread.Sleep(400); 
     return 5; 
    } 
} 

更新:

我已经更新了代码。当我运行这个代码时,我得到了以下输出。

enter image description here

只有两个任务都完成了的10,所以我想知道什么是与此代码的问题?

注:我在4.5.2框架中运行此代码。

+4

假如你试图给'Tuple '变量赋一个'int'值,它看起来并不像代码甚至会编译。请提供[mcve]。 (我也建议使用'Task.Run'而不是'TaskFactory.StartNew' ...) –

+0

@ JonSkeet-由于错误的Tuple被添加。我更新了代码。而我正在使用4.0框架,所以运行该方法不可用。 – Girish

+0

这些信息值得一提,因为这几天需要4.0是多么罕见......而且你还没有发布[mcve],这会让你更容易帮助你。 –

回答

1

如果您需要等待任务完成,您可以使用属性结果。 Result属性阻塞调用线程直到任务完成。

var task = Task<int>.Factory.StartNew(() => GetsomeValue()); int res = task.Result;

+0

我在Result部分使用Result属性。如果任务完成,那么我使用任务的结果,否则我执行其他语句。 – Girish

+0

看起来OP最多等了2秒钟。这是一件完全合理的事情,并建议无条件地阻止不符合他们的用例。 –

3

的问题不在于Task.Wait不等待足够长的时间在这里 - 那就是你假设只要你拨打Task.Factory.StartNew()(你应该几乎不这么做,顺便说一句 - use Task.Run instead)任务开始。事实并非如此。任务调度是一个复杂的话题,我不认为是专家,但是当你同时开始很多任务时,线程池会在创建一个新线程之前等待一段时间,看看它是否可以重用它。

如果您向代码添加更多日志记录,则可以看到此内容。我在Wait呼叫之前和之后以及Sleep呼叫之前和之后添加了日志记录,确定涉及到哪个原始值i。 (我按照惯例调用线程,但事实并非如此)。日志使用DateTime.UtcNow,并使用MM:ss.FFF的模式显示时间戳,时间戳为毫秒。

这里是日志的输出单个任务完成:

12:01.657: Before Wait in thread 7 
12:03.219: Task for thread 7 started 
12:03.623: Task for thread 7 completing 
12:03.625: After Wait in thread 7 

这里Wait调用返回小于2秒后,但因为任务已经完成这很好。

而这里的日志输出单个任务没有完成:

12:01.644: Before Wait in thread 6 
12:03.412: Task for thread 6 started 
12:03.649: After Wait in thread 6 
12:03.836: Task for thread 6 completing 

这里Wait真的等待2秒,但仍然任务还没有完成,因为它只有在Wait时间到来之前才正确启动只需