Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 6601919
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 25, 20262026-05-25T18:48:54+00:00 2026-05-25T18:48:54+00:00

I don’t know if I am thinking in the wrong way about TPL, but

  • 0

I don’t know if I am thinking in the wrong way about TPL, but I have difficulty understanding how to obtain the following:

I have two functions

Task<A> getA() { ... }
Task<B> getB(A a) { ... }

This seems to occur often: I can asyncronously get an A. And given an A, I can asynchronously get a B.

I can’t figure out the correct way to chain these functions together in TPL.

Here is one attempt:

Task<B> Combined()
{
    Task<A> ta = getA();
    Task<Task<B>> ttb = ta.ContinueWith(a => getB(a.Result));
    return ttb.ContinueWith(x => x.Result.Result);
}

The ContinueWith is where I get confused. The returned type is a “double-Task”, Task<Task<B>>. This somehow just seems wrong to me.

UPDATE 2011-09-30:

By coincidence I found the extension method TaskExtensions.Unwrap that operates on a Task<Task<T>> to give a Task<T>.
So until we get C# 5.0, I can do ta.ContinueWith(a=>…).UnWrap() in situations like this where the continuation itself returns a task.

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-25T18:48:55+00:00Added an answer on May 25, 2026 at 6:48 pm

    Does your getB have to be a method which returns Task<B> rather than B?

    The problem is that ContinueWith is:

    public Task<TNewResult> ContinueWith<TNewResult>(
        Func<Task<TResult>, TNewResult> continuationFunction,
        CancellationToken cancellationToken
    )
    

    So in your case, because getB returns Task<B>, you’re passing in a Func<Task<A>, Task<B>>, so TNewResult is Task<B>.

    If you can change getB to just return a B given an A, that would work… or you could use:

    return ta.ContinueWith(a => getB(a.Result).Result);
    

    Then the lambda expression will be of type, Func<Task<A>, B> so ContinueWith will return a Task<B>.

    EDIT: In C# 5 you could easily write:

    public async Task<B> CombinedAsync()
    {
        A a = await getA();
        B b = await getB(a);
        return b;
    }
    

    … so it’s “just” a matter of working out what that ends up as. I suspect it’s something like this, but with error handling:

    public Task<B> CombinedAsync()
    {
        TaskCompletionSource<B> source = new TaskCompletionSource();
        getA().ContinueWith(taskA => {
            A a = taskA.Result;
            Task<B> taskB = getB(a);
            taskB.ContinueWith(t => source.SetResult(t.Result));
        });
        return source.Task;
    }
    

    Does that make sense?

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

Don't know how to google for such, but is there a way to query
Don't know why but I can't find a solution to this. I have 3
Don't need to do this right now but thinking about the future... What would
Don't really know how to formulate the title, but it should be pretty obvious
Don't know if I worded the question right, but basically what I want to
(Don't know if this is strictly on-topic, but I don't see any better Stack
Don't know how to explain it better but i'm trying to get a response
Don't know whats exactly going on, but it's definitely killing my time for nothing.
I don't know if this question is trivial or not. But after a couple
Don't know what's wrong here, when I run the application it says Specified method

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.