CS1988|C#无法在异步方法中使用ref,in,out类型的参数的问题

news/2024/7/23 10:46:17 标签: c#, 开发语言, .net, Blazor

CS1988|C#无法在异步方法中使用ref,in,out类型的参数

🌀|场景:

请添加图片描述

BlazorServer的场景中推荐使用异步方法,使用ref,out,in为参数前缀则报错CS1988

原因如下:

ref parameters are not supported in async methods because the method may not have completed when control returns to the calling code. Any changes to the referenced variables will not be visible to the calling code, resulting in a CS1988 error.

async 方法不支持 ref 参数,因为当控件返回到调用代码时,该方法可能尚未完成。 对引用变量的任何更改都对调用代码不可见,从而导致 CS1988 错误。

⛵️|替代方法:

将需要用到的参数作为Task的返回,即

请添加图片描述

💥|延申:引用变量的可见性

1.当不使用基础类型为参数,使用引用类型时:

现有Blazor页面如下

@page "/login"

@using KatexTest2.Models
@using KatexTest2.Utils
@inject MyAuthProvider provider


<h3>LoginPage</h3>

<AuthorizeView>
    <NotAuthorized>
        
        @if(Isfailed){
            <span>用户名或密码错误</span>
        }
        
        @if (test.Number==114.514M)
        {
            <span>压力吗室内</span>
        }
        <EditForm id = "LP" Model="loginModel" Context="Login">
            <div>
                <label> Username: 
                    <InputText @bind-Value="loginModel.Username"></InputText>
                </label>
            </div>
            <div>
                <label> Password:
                    <InputText type="password" @bind-Value="loginModel.Password"></InputText>
                </label>
            </div>
            <div>
                <button @onclick="TryLogin">Submit</button>
            </div>
        </EditForm>    
    </NotAuthorized>
    <Authorized>
        <button type="button" class="btn btn-primary" @onclick="TryLogout" ></button>
    </Authorized>    
    <Authorizing>
        <span>翼沿丁真</span>
    </Authorizing>
</AuthorizeView>


@code {

    public class RefTest
    {
        public string Context { get; set; } = "DefaultContext";

        public decimal Number { get; set; } = 11.54M;
    }

    [Parameter]
    public Boolean Isfailed { get; set; } = false;

    public RefTest test { get; set; } = new();

    private LoginFormModel loginModel { get; set; } = new();

    private async Task TryLogin()
    {
        
       Isfailed  =  await provider.LoginAsync(loginModel,test);
        
    }

    private async Task TryLogout()
    {
        await provider.LogoutAsync();
    }
}

修改LoginAsync方法如下:

 public async Task<Boolean> LoginAsync(LoginFormModel loginFormModel,RefTest test)
{
    var (userInDatabase, isSuccess) = LookUpUser(loginFormModel.Username, loginFormModel.Password);
    var principal = new ClaimsPrincipal();

    if (isSuccess)
    {
        var identity = CreateIdentityFromUser(userInDatabase);
        principal = new ClaimsPrincipal(identity);
        await _protectedLocalStorage.SetAsync("identity", JsonConvert.SerializeObject(userInDatabase));
    }
    else
    {
        test.Number = 114.514M;
    }

    NotifyAuthenticationStateChanged(Task.FromResult(new AuthenticationState(principal)));

    await jsRuntime.InvokeVoidAsync("alert", new object[1] { "WTF" });

    return !isSuccess;
}

运行测试:

请添加图片描述

从图中可以看出:

在方法的运行时间内,razor page并不能获取对象信息改变的值(运行完成后可以),如果是一些运行时间长的方法,则可能造成一些响应不及时的效果。例如拿掉权限后依旧可以访问一些东西

🔚|结论:

如果要在async方法中获取一些返回值,请直接加在的Task的返回中。

应避免使用引用类型为参数来充当返回值。


http://www.niftyadmin.cn/n/4948632.html

相关文章

linux系统中的中文显示问题

经常遇到这种情况&#xff1a;某些项目的文件中不可避免地包含有中文&#xff0c;在Windows系统中没有任何问题&#xff0c;拷到Linux系统中就出问题了。 1. Linux系统设置 $echo $LANG en_US.iso885915 朋友建议我设置为&#xff1a; export LANGzh_CN.utf8 但我这样设置之…

vue3中使用mock.js

什么是mockjs Mock.js 是一个用于生成随机数据的模拟数据生成库。它可以帮助开发人员在前端开发中创建模拟接口&#xff0c;以便进行测试和开发。 以下是 Mock.js 的一些主要功能和用法&#xff1a; 生成随机数据&#xff1a;Mock.js 提供了丰富的数据模板语法&#xff0c;可以…

x86 Linux系统下构建交叉编译工具(2)

接前一篇文章&#xff1a;x86 Linux系统下构建交叉编译工具&#xff08;1&#xff09; 本文参考以下文章&#xff1a; 建立交叉编译器 for arm &#xff08;binutils-2.17 gcc-3.4.6 glibc-2.3.6&#xff09; 特此致谢&#xff01; 上一回准备好了编译构建的环境&#xff0c;…

使用Druid解析SQL,获取SQL中所有使用的表

一、sqlParse组成 Druid SQL Parser分三个模块&#xff1a; - Parser - AST - Visitor 1.1 Parser parser是将输入文本转换为ast&#xff08;抽象语法树&#xff09;&#xff0c;parser有包括两个部分&#xff0c;Parser和Lexer&#xff0c;其中Lexer实现词法分析&#x…

request发送http请求

今天正式开始为大家介绍接口自动化&#xff0c;相信很多做测试的朋友&#xff0c;都用过一些工具&#xff0c;比如jmeter&#xff0c;loadrunner&#xff0c;postman等等&#xff0c;所以今天先给那些基础不太好的同学&#xff0c;先讲讲postman如何来测接口以及如何用pthon代码…

无涯教程-Perl - tell函数

描述 此函数返回指定FILEHANDLE中读取指针的当前位置(以字节为单位)。如果省略FILEHANDLE,则它将返回上次访问的文件中的位置。 语法 以下是此函数的简单语法- tell FILEHANDLEtell返回值 此函数以字节为单位返回当前文件位置。 例 以下是显示其基本用法的示例代码,要检…

接口测试重点方面

主要包括以下几个方面&#xff1a; 1.检查接口的功能&#xff1a;检查接口的功能有没有实现&#xff0c;也就是请求会不会成功&#xff0c;如果不成功会不会返回错误代号&#xff08;或错误信息&#xff09;&#xff1b; 2.检查接口返回的数据&#xff1a;检查接口返回的数据、…

算法通关村第4关【青铜】| 栈基础

1. 栈基础 栈的特征&#xff1a; 存取受限的线性表后进先出 栈的操作&#xff1a; push()pop()peek()empty() 2.数组实现栈 限制数组的存取规则&#xff0c;实现后进先出。注意数组边界的处理 public class Stack1<T> {private Object[] stack;private int top;//…