gpt4 book ai didi

c# - 传递异步委托(delegate)的方法签名是什么?

转载 作者:IT王子 更新时间:2023-10-29 03:53:17 26 4
gpt4 key购买 nike

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

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

我认为声明会像下面这样。请注意,此函数不是异步的;即它的异步性独立于委托(delegate)。

void DoSomethingWithCallback(async delegate foo(int)) 
{
...
foo(42);
...
}

电话会是这样的:

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

当然,这些都无法编译,而且我见过的大多数示例都假设有一个字段或属性是委托(delegate),而不是我想使用的匿名委托(delegate)。

最佳答案

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

void DoSomethingWithCallback(Func<int,Task> callbackDelegate)
{
Task t = callbackDelegate(42);
}

如果此函数实际上不对返回的 Task 对象执行任何操作(如上面所示的代码),您可以改为使用 Action<int>作为委托(delegate)类型。如果您使用 Action,您仍然可以声明委托(delegate)异步(如下所示),但返回的隐式 Task 对象将被忽略。

调用上述函数的 lambda 语法很简单,您在问题中使用的语法是正确的。请注意,这里不需要指定参数类型,因为它可以推断出来:

DoSomethingWithCallback(async (intParam) => { this.myint = await Int2IntAsync(intParam); });

如果你愿意,你也可以传递一个方法或委托(delegate)变量,而不是使用 lambda 语法:

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

关于c# - 传递异步委托(delegate)的方法签名是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8511466/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com