C# 将回调方法转换为任务

C# 将回调方法转换为任务,c#,C#,在C#中,是否有转换的方法: Foo(Action<T> onComplete); Foo(完成操作); 进入: Task FooTask(); Foo函数是外部库的一部分,无法修改。看起来像是针对以下对象的作业: SetResult完成返回的任务,并将其Result设置为传递到Foo的回调中的值。看起来像是用于: SetResult完成返回的任务,并将它的Result设置为传递给Foo的回调的值。我不确定当T被传递到操作而不是从中返回时,它是否会起作用(这将是Func或Fun

在C#中,是否有转换的方法:

Foo(Action<T> onComplete);
Foo(完成操作);
进入:

Task FooTask();
Foo函数是外部库的一部分,无法修改。

看起来像是针对以下对象的作业:

SetResult
完成返回的
任务
,并将其
Result
设置为传递到
Foo
的回调中的值。

看起来像是用于:


SetResult
完成返回的
任务
,并将它的
Result
设置为传递给
Foo
的回调的值。

我不确定当
T
被传递到
操作
而不是从中返回时,它是否会起作用(这将是
Func
Func
)?@MartinCostello是的,
T
将被传递到
SetResult
,该结果可以转换为
Action
。从NET5开始,可以使用非通用
TaskCompletionSource
,这可能对非通用
操作
@JL0PD-Nice有用,这比必须先使用
TaskCompletionSource
然后再使用
SetResult(null)
要好。我不确定当
T
被传递到
操作中,而不是从它返回(这将是
Func
Func
)时,这是否会起作用?@MartinCostello是的,而
T
将被传递到
SetResult
,该结果可以转换为
Action
。从NET5开始,可以使用非通用
TaskCompletionSource
,这可能对非通用
Action
@JL0PD-Nice有用,这比必须先使用
TaskCompletionSource
然后再使用
SetResult(null)
要好。
Task<T> FooTask();
Task<T> FooAsync<T>()
{
    var tcs = new TaskCompletionSource<T>();

    Foo(tcs.SetResult);

    return tcs.Task;
}
var result = await FooAsync<YourType>();