传递异步委托的方法签名是什么?

And*_*ewS 48 c# delegates asynchronous

我最近从Objective-C领域回到C#,而C#5中的async/await关键字看起来很酷.但我仍然试图掌握正确的语法.

我想声明一个将异步委托作为参数的方法,但是我无法使调用者和被调用者语法都正确.有人可以提供代码示例,显示方法声明,调用和对委托的调用吗?

我认为声明将如下所示.请注意,此函数不是异步的; 即它的异步性与代表无关.

void DoSomethingWithCallback(async delegate foo(int)) 
{
    ...
    foo(42);
    ...
}
Run Code Online (Sandbox Code Playgroud)

电话会是这样的:

DoSomethingWithCallback(async (int x) => { this.SomeProperty = await SomeAsync(x); });
Run Code Online (Sandbox Code Playgroud)

当然,这些都没有编译,我见过的大部分样本都假设有一个字段或属性是委托,而不是我想使用的匿名委托.

And*_*ewS 61

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

void DoSomethingWithCallback(Func<int,Task> callbackDelegate)
{
    Task t = callbackDelegate(42);
}
Run Code Online (Sandbox Code Playgroud)

如果此函数实际上没有对返回的Task对象执行任何操作(与上面显示的代码一样),则可以将其Action<int>用作委托类型.如果使用Action,仍然可以声明委托async(下面),但忽略返回的隐式Task对象.

用于调用上述函数的lambda语法很简单,并且您在问题中使用的语法是正确的.请注意,此处不需要指定参数类型,因为可以推断出:

DoSomethingWithCallback(async (intParam) => { this.myint = await Int2IntAsync(intParam); });
Run Code Online (Sandbox Code Playgroud)

如果愿意,您也可以传递方法或委托变量,而不是使用lambda语法:

async Task MyInt2Int(int p) { ... }
Func<int,Task> myDelegate;
void OtherMethod()
{
    myDelegate = MyInt2Int;
    DoSomethingWithCallback(myDelegate); // this ...
    DoSomethingWithCallback(MyInt2Int);  // ... or this.
}
Run Code Online (Sandbox Code Playgroud)


Dan*_*ann 9

如果我有一个想要传递但不执行的任务,我可以将 Task 包装在 a 中Func<>,然后调用它Func<>来创建该任务。该await可以正常方式使用。

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;
    }
}
Run Code Online (Sandbox Code Playgroud)


Joh*_*zen 7

方法signatue的Task返回类型是没有返回类型,或者Task<T>是否有返回类型.

那么,我不是百分之百确定你是否可以拥有这样的异步lambda.

在使用该任务的方法中,您将"等待"该任务或使用Task上的属性和方法来获取结果.

  • 是的,我们支持异步lambdas.如果我自己这么说的话,那就太漂亮了. (13认同)