使用打印语句组织任务结果

本文关键字:任务 结果 语句 打印 | 更新日期: 2023-09-27 18:21:45

我正在使用task、BeginGetResponse、EndGetResponse和fromasync发送URL,并继续使用方法。使用Console.WriteLine,有没有一种方法可以在每个url返回时组织/安排结果?当我尝试处理此问题时,打印语句不同步。

示例:

1.网址:google.com-响应状态:up-发送时间-接收时间2.雅虎网址etc

使用打印语句组织任务结果

如果您想按特定顺序打印结果,而不是按它们碰巧完成的顺序打印,那么不要将ContinueWith调用中的打印语句添加到每个任务中。相反,在所有任务的集合上调用WhenAll,然后向打印所有值的添加一个延续。

public static void AddPrintStatements(IEnumerable<Task<string>> tasks)
{
    Task.WhenAll(tasks)
        .ContinueWith(t =>
        {
            foreach (var line in t.Result)
                PrintResults(line);
        });
}

由于您使用的是4.0,并且没有WhenAll,因此可以使用以下内容:

public static Task<IEnumerable<T>> WhenAll<T>(IEnumerable<Task<T>> tasks)
{
    return Task.Factory.ContinueWhenAll(tasks.ToArray(),
        results => results.Select(t => t.Result));
}

如果你希望结果在输入时打印出来,同时保持它们的顺序,那么你也可以通过遍历每个任务并添加一个既是前一个延续又是给定任务的延续来做到这一点:

public static void AddPrintStatements2(IEnumerable<Task<string>> tasks)
{
    Task continuation = Task.FromResult(true);
    foreach (var task in tasks)
    {
        continuation = continuation.ContinueWith(t =>
            task.ContinueWith(t2 => PrintResults(t2.Result)))
            .Unwrap();
    }
}

由于您使用的是4.0,因此也不会有FromResult,因此您可以使用以下内容:

public static Task<T> FromResult<T>(T result)
{
    var tcs = new TaskCompletionSource<T>();
    tcs.SetResult(result);
    return tcs.Task;
}