为了账号安全,请及时绑定邮箱和手机立即绑定

如何在异步方法中使用 Span<byte>?

如何在异步方法中使用 Span<byte>?

C#
慕容森 2023-07-22 16:09:38
我正在尝试使用以下代码确定异步方法中有效的 base64 字符串:public static async Task<bool> IsBase64String(string base64){    Span<byte> buffer = new Span<byte>(new byte[base64.Length]);    return await Task.FromResult(Convert.TryFromBase64String(base64, buffer, out int bytesParsed));}但是 Span 不能在异步方法中声明,请帮忙吗?
查看完整描述

3 回答

?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

如果需要Span<T>async方法中使用 a并且可以使用 C# 7 或更高版本,那么您可以利用称为本地函数的语言功能来解决错误Parameters or locals of type 'T' cannot be declared in async methods or lambda expressions。下面是一个如何做到这一点的示例......这再次是为了解决给定的原因。

using System;

using System.Text;

using System.Threading.Tasks;


public class Program

{

    public static async Task Main(string[] args)

    {

        var base64Str = Convert.ToBase64String(Encoding.UTF8.GetBytes("this is a Base64 str"));

        var notBase64Str = "this is not a Base64 str";

        Console.WriteLine(await IsBase64String(base64Str)); // True

        Console.WriteLine(await IsBase64String(notBase64Str)); // False

    }


    public static async Task<bool> IsBase64String(string base64)

    {

        return await Task.FromResult(CheckIfIsBase64String());

        // Note the use of a local non-async function so you can use `Span<T>`

        bool CheckIfIsBase64String()

        {

            // the use of stackalloc avoids array heap allocation

            Span<byte> buffer = stackalloc byte[base64.Length];

            return Convert.TryFromBase64String(base64, buffer, out int bytesParsed);

        }

    }

}


查看完整回答
反对 回复 2023-07-22
?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

我正在尝试确定异步方法中有效的 base64 字符串

为什么?该方法没有任何异步之处。解决这个问题的正确方法是删除关键字async

public static bool IsBase64String(string base64){
  Span<byte> buffer = new Span<byte>(new byte[base64.Length]);
    return Convert.TryFromBase64String(base64, buffer, out int bytesParsed);
}


查看完整回答
反对 回复 2023-07-22
?
墨色风雨

TA贡献1853条经验 获得超6个赞

System.IO.Stream例如,如果您观察方法,您将看到同步方法Stream.Read()和Stream.Write()acceptSpan<byte>以及异步方法Stream.ReadAsync()和Stream.WriteAsync()accept Memory<byte>。因此,如果您使用真正的异步方法,则不需要创建Span<>.


在您的情况下,您不需要将结果包装在Task. 该操作将同步完成并写入Task. 因此,当您将其包装在Taskand awaitit 中时,您实际上是在说“将这个结果包装在任务中,然后给我任务的结果。”。


但如果您确实想Task从方法中返回,则可以删除async和await关键字。该方法仍然可以从外部等待。(再次强调:在这种情况下,无需将结果包装在 中Task)


// Removed async await

public static Task<bool> IsBase64StringAsync(string base64)

{

    Span<byte> buffer = new Span<byte>(new byte[base64.Length]);

    return Task.FromResult(Convert.TryFromBase64String(base64, buffer, out int bytesParsed));

}


// Synchronous method

public static bool IsBase64String(string base64)

{

    Span<byte> buffer = new Span<byte>(new byte[base64.Length]);

    return Convert.TryFromBase64String(base64, buffer, out int bytesParsed);

}


查看完整回答
反对 回复 2023-07-22
  • 3 回答
  • 0 关注
  • 290 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信