C# 什么';传递异步委托的方法签名是什么?

C# 什么';传递异步委托的方法签名是什么?,c#,asynchronous,delegates,C#,Asynchronous,Delegates,我最近从Objective-C领域回到了C,C#5中的async/await关键字看起来很酷。但我仍在努力掌握正确的语法 我想声明一个将异步委托作为参数的方法,但在获取调用方和被调用方语法时遇到了问题。有人能提供一个代码示例来显示方法声明、调用和对委托的调用吗 我想宣言应该是这样的。注意这个函数不是异步的;i、 其异步性与委托无关 void DoSomethingWithCallback(async delegate foo(int)) { ... foo(42); .

我最近从Objective-C领域回到了C,C#5中的async/await关键字看起来很酷。但我仍在努力掌握正确的语法

我想声明一个将异步委托作为参数的方法,但在获取调用方和被调用方语法时遇到了问题。有人能提供一个代码示例来显示方法声明、调用和对委托的调用吗

我想宣言应该是这样的。注意这个函数不是异步的;i、 其异步性与委托无关

void DoSomethingWithCallback(async delegate foo(int)) 
{
    ...
    foo(42);
    ...
}
电话可能是这样的:

DoSomethingWithCallback(async (int x) => { this.SomeProperty = await SomeAsync(x); });

当然,这些都不会编译,而且我看到的大多数示例都假设一个人有一个字段或属性是委托,而不是我想要使用的匿名委托。

如果没有返回类型,则方法签名的返回类型是
Task
,如果有返回类型,则返回类型是
Task

Tho,我不是100%确定你是否可以拥有像那样的异步lambda


在使用任务的方法中,您可以“等待”任务,或者使用任务的属性和方法来获得结果。

将委托作为参数的函数必须使用命名委托类型;与Objective-C不同,您不能在函数定义中内联声明匿名委托类型。但是,提供了泛型Action和Func,因此您不必自己声明新类型。在下面的代码中,我假设委托将一个
int
作为参数

void DoSomethingWithCallback(Func<int,Task> callbackDelegate)
{
    Task t = callbackDelegate(42);
}
如果愿意,也可以传递方法或委托变量,而不是使用lambda语法:

async Task MyInt2Int(int p) { ... }
Func<int,Task> myDelegate;
void OtherMethod()
{
    myDelegate = MyInt2Int;
    DoSomethingWithCallback(myDelegate); // this ...
    DoSomethingWithCallback(MyInt2Int);  // ... or this.
}
异步任务MyInt2Int(intp){…} Func-myDelegate; void OtherMethod() { myDelegate=MyInt2Int; DoSomethingWithCallback(myDelegate);//此。。。 DoSomethingWithCallback(MyInt2Int);/…或此。 }
如果我有一个想要传递但没有执行的任务,我可以将该任务包装在
Func
中,然后调用该
Func
来创建该任务。
wait
可以正常使用

public class Example {
    public Example(Func<Task> toBeExecutedInTheFuture)
    {
        FutureTask = toBeExecutedInTheFuture;
    }

    public async void ExecuteTaskExample()
    {
        await FutureTask();

        // or alternatively

        var myTask = FutureTask();
        // do work
        await myTask;
    }
}
公共类示例{
公共示例(未来将执行的功能)
{
未来任务=在未来被执行;
}
公共异步void ExecuteTaskExample()
{
等待未来任务();
//或者
var myTask=FutureTask();
//工作
等待我的任务;
}
}

是的,我们支持异步lambda。如果我自己这么说的话,那就太圆滑了。据我所知,没有办法像我在上面的问题中那样内联指定委托。若要将委托用作方法参数,需要在类范围之外声明委托类型。
public class Example {
    public Example(Func<Task> toBeExecutedInTheFuture)
    {
        FutureTask = toBeExecutedInTheFuture;
    }

    public async void ExecuteTaskExample()
    {
        await FutureTask();

        // or alternatively

        var myTask = FutureTask();
        // do work
        await myTask;
    }
}