任务不会等到等待时间

时间:2017-07-28 07:35:21

标签: c# multithreading asynchronous task

我创建了一个任务并为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框架中运行此代码。

2 个答案:

答案 0 :(得分:4)

问题不在于Task.Wait在这里等待的时间不长 - 而是你假设只要你打电话给Task.Factory.StartNew()(你几乎不会这样做,顺便说一下 - { {3}}),任务开始了。事实并非如此。任务调度是一个复杂的主题,我并不认为自己是专家,但是当你同时启动很多任务时,线程池会在创建新线程之前等待一段时间,看它是否可以重用它。

如果您向代码添加更多日志记录,则可以看到此信息。我在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秒,但该任务仍未完成,因为它仅在{{1}之前正确启动 时间到了。

答案 1 :(得分:1)

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

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