Confusion regarding TaskCompletionSource

I’m writing a turn-based game, and I have been using async methods to properly control consecutive actions. Whenever the player is prompted to choose objects to interact with, the game calls the below async method for that player:

public async Task<List<GameObject>> SubmitObjs(List<GameObject> options, int selN)
{
    List<GameObject> result = new List<GameObject>();
    centralTime.ToggleOutlines(options, 1, true);
    while (result.Count < selN)
    {
        selection = new TaskCompletionSource<GameObject>(TaskCreationOptions.RunContinuationsAsynchronously);
        await selection.Task;  //Player Decision is awaited here...
        Debug.Log("Selection Decided");
        GameObject obj = selection.Task.Result;
        if (obj && options.Contains(obj))
            if (result.Contains(obj))
            {
                result.Remove(obj);
                centralTime.ToggleOutlines(new List<GameObject>() { obj }, 1, true);
            }
            else
            {
                result.Add(obj);
                centralTime.ToggleOutlines(new List<GameObject>() { obj }, 2, true);
            }
    }
    centralTime.OutlineOff();
    return result;
}

To allow the player to click on objects that they want to interact with, I have written Update() as below as well:

private void Update()
{
    if (isLocal)
    {
        if (Input.GetMouseButtonDown(0))
        {
            GameObject DO = DetectValObj();
            if(DO) selection.TrySetResult(DO);
        }
    }
    else
    {
        //Recieve Online player Action Calls...
    }
}

As you can see, the asynchronous SubmitObjs is supposed to be awaiting the TrySetResult() in Update so that when the player Clicks on the object, it resumes the process to submit the object the player decided.

However, what really happens is that clicking on the objects and running selection.TrySetResult() doesn’t resume the processing in SubmitObjs. I tested DetectValObjs() and it is transferring DO into TrySetResult() properly, and what’s more frustrating is that in one in ten tries, SubmitObjs() would resume and process with the passed object.

Honestly, I don’t think I understand TaskCompletionSource and SetResult properly. I looked up many references and examples, but I can’t figure out why exactly does TrySetResult resumes awaited task only some of the time.

What exactly is going on here, and how can I fix this to make them work as intended?