从 Task<(string,object)> 转换为 Task<string>

Converting from Task<(string,object)> to Task<string>

是否可以从 Task<(string,object)> 转换为 Task<string>?我有一个接收 Task<string> 作为参数的方法,但是从另一个返回类型的方法我得到 Task<(string,object)>.

是的,只需使用 lambda:

var task_with_obj = func();

Func<Task<string>> func_string = async () => (await task_with_obj).Item1;
var task = func_string();

ContinueWith 使用给定的 Func<Task<T>, U>:

Task<T> 转换为 Task<U>
Task<(string, object)> tupleTask = MethodThatReturnsTupleTask();
Task<string> stringTask = tupleTask.ContinueWith(tuple => tuple.Result.Item1);
MethodThatAcceptsStringTask(stringTask);

你可以使用 LINQ to Tasks:

Task<(string, object)> task1 = GetStuffAsync();
Task<string> task2 = task1.Select(value => value.Item1);

这里是 Select 运算符:

public static async Task<T2> Select<T1, T2>(this Task<T1> source, Func<T1, T2> selector)
{
    return selector(await source);
}

可在此处找到完整的 Linq-to-Tasks“套件”:LinqToTasks.cs. It is part of the ParallelExtensionsExtras package. Its implementation predates async/await, so it is based on the primitive ContinueWith 方法,包含所有相关内容(异常行为不佳等)。