我创建了一个任务并为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;
}
}
更新:
我已经更新了代码。当我运行此代码时,我得到以下输出。
在10个中只完成了两个任务。所以我想知道这个代码有什么问题?
注意:我在4.5.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;