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

这篇具有很好参考价值的文章主要介绍了CS1988|C#无法在异步方法中使用ref,in,out类型的参数的问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

🌀|场景:

CS1988|C#无法在异步方法中使用ref,in,out类型的参数的问题,.NET,C#/.NET CORE,c#,开发语言,.net,Blazor

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的返回,即

CS1988|C#无法在异步方法中使用ref,in,out类型的参数的问题,.NET,C#/.NET CORE,c#,开发语言,.net,Blazor

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

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

运行测试:

CS1988|C#无法在异步方法中使用ref,in,out类型的参数的问题,.NET,C#/.NET CORE,c#,开发语言,.net,Blazor

从图中可以看出:

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

🔚|结论:

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

应避免使用引用类型为参数来充当返回值。文章来源地址https://www.toymoban.com/news/detail-654884.html

到了这里,关于CS1988|C#无法在异步方法中使用ref,in,out类型的参数的问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C#out、ref和params参数

    out参数用于传递一个方法的输出值。它表示在方法内部,该参数没有被初始化,而是由方法赋值。方法结束后,该参数会被赋予一个值。 在使用out参数时,调用方法时必须指定该参数,并且不需先进行初始化。 out参数可以在方法内部定义,并且可以定义多个。 ref参数用于在

    2024年02月13日
    浏览(46)
  • c# ref和out参数修饰符

    ref:把值类型变成引用类型传递,形参的值改变了实参的值也会改变 out:使方法可以有多个返回值

    2024年01月16日
    浏览(47)
  • C++中ios::in, ios::out, ios::trunc使用

    目录 一,ios::in 二,ios::out 三,ios::trunc 四,组合使用 在C++中,ios::in和ios::out是iostream库中定义的一些标志,用于控制文件流对象(如fstream、ifstream和ofstream)的行为。 ios::in: 这个标志用于以输入模式打开文件,即用于从文件中读取数据。如果你使用ifstream(输入文件流)来打

    2024年02月02日
    浏览(30)
  • C#异步方法async/await的三种返回类型

    有群友问C#异步方法async返回值Task和void的区别?看似简单,但不容易把它们用好。在C#中的异步编程已经成为现代编程的标配,异步方法(async/await)是实现异步编程的一种常用方式。在异步方法中,可以使用 Task 或 void 作为返回类型,还可以使用ValueTask返回类型。本文将介绍

    2024年02月04日
    浏览(49)
  • labelImg无法保存classes文件的解决方法(IndexError: list index out of range)

    憨憨程序员,其实是有做读取旧classes保存到新classes功能的,但是看完代码发现就启动程序初始化的时候调用了一次,change save dir的时候根本没有调用。 我实力有限,只能靠比较愚蠢的方法解决了。 首先找到我们安装labelImg的地址,比如我就是放到conda环境里面,所以在这个

    2024年04月24日
    浏览(41)
  • vue3父组件使用ref调用子组件方法

    在vue2中,父组件通过ref调用子组件的方法只需要给子组件添加ref属性,然后使用this.$refs.XXX.method即可 但是在vue3中,子组件需先使用defineExpose将方法暴露给父组件 调用方法如下: 1、使用getCurrentInstance 2、使用ref函数创建一个响应式的引用,并将其绑定到子组件上

    2024年01月16日
    浏览(50)
  • OSC_in 和 OSC_out 引脚 OSC32_IN和OSC32_OUT

    一般在单片机上都有 OSCin 和 OSCout 两个晶振接入端口 ,我们可以用无源的晶振加上起震电容可以配合单片机是晶振起震,为系统提供时钟源。 顾名思义在OSCout端可以输出正弦波,给别的器件提供振荡源,这个时候最好在两者之间加上一个56p左右的电容用来抑制频率的直流漂

    2024年02月11日
    浏览(33)
  • 【Azure 应用服务】Azure JS Function 异步方法中执行SQL查询后,Callback函数中日志无法输出问题

    开发 Azure JS Function(NodeJS),使用 mssql 组件操作数据库。当SQL语句执行完成后,在Callback函数中执行日志输出 context.log(\\\" ...\\\") , 遇见如下错误: Warning: Unexpected call to \\\'log\\\' on the context object after function execution has completed. Please check for asynchronous calls that are not awaited or calls to \\\'done\\\' ma

    2024年02月03日
    浏览(47)
  • vue中使用this.$refs获取不到子组件的方法,属性方法都为undefined的解决方法

    因为注册了多个ref,获取是不能单单知识refs.xxx,需要使用数组和索引来获取具体一个组件refs[index].xxx 额……就像这样😐 好这么一写,导致前两个组件都无法正常使用…… 页面也会有这个报错: 组件名 - did you register the component correctly? For recursive components, make sure to provide

    2024年02月13日
    浏览(51)
  • 【解决方法】numpy.float64类型数据无法被解释为整数

    【解决方法】numpy.float64类型数据无法被解释为整数 在使用Python语言进行数据处理时,经常需要用到NumPy库中的各种数据类型和数学函数。其中,Numpy.float64是一种十分常见的数据类型。 然而,有时候我们会遇到这样的错误提示:【numpy.float64 object cannot be interpreted as an integer】

    2024年02月16日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包