我想写一个带有out
参数的异步方法,如下所示:
public async void Method1()
{
int op;
int result = await GetDataTaskAsync(out op);
}
如何在GetDataTaskAsync
中执行此操作?
在异步方法中不能有ref
或out
parameters(如前所述)。
这就迫切需要在移动的数据中建立一些模型:
public class Data
{
public int Op {get; set;}
public int Result {get; set;}
}
public async void Method1()
{
Data data = await GetDataTaskAsync();
// use data.Op and data.Result from here on
}
public async Task<Data> GetDataTaskAsync()
{
var returnValue = new Data();
// Fill up returnValue
return returnValue;
}
您可以更轻松地重用代码,而且它比变量或元组更具可读性。
C#7解决方案是使用隐式元组语法。
private async Task<(bool IsSuccess, IActionResult Result)> TryLogin(OpenIdConnectRequest request)
{
return (true, BadRequest(new OpenIdErrorResponse
{
Error = OpenIdConnectConstants.Errors.AccessDenied,
ErrorDescription = "Access token provided is not valid."
}));
}
返回结果使用方法签名定义的属性名。例如:
var foo = await TryLogin(request);
if (foo.IsSuccess)
return foo.Result;
不能使用带有 ref
或 out
参数的异步方法。
Lucian Wischik解释了为什么在这个MSDN线程上不可能这样做:http://social.msdn.microsoft.com/Forums/en-US/d2f48a52-e35a-4948-844d-828a1a6deb74/why-async-methods-cannot-have-ref-or-out-parameters
至于为什么异步方法不支持引用外参数?(或引用参数?这是 CLR 的一个限制。我们选择以与迭代器方法类似的方式实现异步方法,即通过编译器将方法转换为状态机对象。CLR 无法安全地将“out 参数”或“引用参数”的地址存储为对象的字段。支持引用外参数的唯一方法是,异步功能是通过低级 CLR 重写而不是编译器重写来完成的。我们研究了这种方法,它有很多事情要做,但它最终会如此昂贵,以至于它永远不会发生。
这种情况的典型解决方法是让async方法返回一个Tuple。您可以这样重写您的方法:
public async Task Method1()
{
var tuple = await GetDataTaskAsync();
int op = tuple.Item1;
int result = tuple.Item2;
}
public async Task<Tuple<int, int>> GetDataTaskAsync()
{
//...
return new Tuple<int, int>(1, 2);
}
问题内容: 我试图研究应如何精确地编写异步函数。经过大量的文档研究之后,我仍然不清楚。 如何为Node编写异步函数? 如何正确实施错误事件处理? 问我问题的另一种方式是:我应该如何解释以下功能? 问题答案: 您似乎将异步IO与异步功能混淆了。由于非阻塞IO更好,所以node.js使用异步非阻塞IO。理解它的最好方法是去观看ryan dahl的一些视频。 如何为Node编写异步函数? 只需编写普通函
我不在乎方法在哪个类(或包)中 注释参数的位置会有所不同。 我知道带注释的值只适用于特定类型 我的切入点实现需要如下内容: 对于值到底需要什么,以及如何将注释与其类型联系起来,我有点困惑。在这一点上,可能不值得列出我尝试过的事情! 更新:根据我在http://stackoverflow.com/questions/3565718/pointcut-matching-methods-with-ann
在vert. x中编写异步请求处理程序的推荐方法是什么? 在此服务中,请求处理通常涉及调用DB、调用外部服务等。但是,我不想阻止请求处理线程。使用vet实现这一目标的推荐方法是什么。十、在一个典型的异步处理链中,我将使用请求处理线程向带有请求对象的消息总线发出消息。另一个处理程序将选择此消息并进行一些处理,例如检查请求参数。然后,这个处理程序可以向总线发出一条新消息,下一个处理程序将执行远程调用,
二.背景 我正在使用C代码库为Android开发一个实时通信应用程序。我使用SWIG生成一个JNI桥,以从Java访问本机代码。为了跟踪正在进行的通话,将用作句柄(指向包含正在进行的通话信息的地址)。以下函数头是如何使用它的示例:
问题内容: 我是节点的新手,并尝试在节点中使用异步和事件行为优势。我以前从节点上了解到,用事件对象处理的所有内容都会异步执行。 然后我尝试了这个,请考虑以下代码: 这是异步执行吗?我认为不!为什么,因为我读了很多这句话: 一个事件被触发了,所以去做点什么,然后当你完成它之后,回来告诉我,但是与此同时,我会做点其他的事情。 就像快餐店的场景。但是上面的代码,当事件工作被触发时,将发生以下顺序: 进入
我知道有几个类似这样的问题贴满了堆栈溢出,但没有一个真正回答我的问题。我正在编写一个helper-private bubbleDown方法来帮助我对公共静态HeapSort方法进行排序。 我知道这样做的目的是将自身视为最大堆,其数据从0(而不是1)开始。 a实际上不是按堆顺序排列的。 但是如果你反复“冒泡”每个非叶子节点,从最后一个开始,你最终会有一个合适的堆。 我已经写了这个算法,但我不确定这是