当前位置: 首页 > 知识库问答 >
问题:

如何编写一个不带out参数的异步方法?

仰翰采
2023-03-14

我想写一个带有out参数的异步方法,如下所示:

public async void Method1()
{
    int op;
    int result = await GetDataTaskAsync(out op);
}

如何在GetDataTaskAsync中执行此操作?

共有3个答案

万俟炯
2023-03-14

在异步方法中不能有refoutparameters(如前所述)。

这就迫切需要在移动的数据中建立一些模型:

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;
}

您可以更轻松地重用代码,而且它比变量或元组更具可读性。

禄豪
2023-03-14

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;
尚鸿才
2023-03-14

不能使用带有 refout 参数的异步方法。

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实际上不是按堆顺序排列的。 但是如果你反复“冒泡”每个非叶子节点,从最后一个开始,你最终会有一个合适的堆。 我已经写了这个算法,但我不确定这是