我正在使用Span将浮点数组转换为字节array.使用普通的for循环是没有问题的,但是对于我所拥有的数量,我需要并行化我的代码,所以我最终使用了Parall.For.问题是我不能在这个循环中使用Span. 这是我的代码:

Span<float> floats = MemoryMarshal.Cast<byte, float>(posColBuffer);
Parallel.For(0, posColBuffer.Length/4, i=>
{

    var scalar = calcScalar(i);
    float color = calcColor(i);

    var id0 = 3 * i;
    for (int j = 0; j < 3; j++)
    {
        floats[i+j] = directions[id0 + j] * scalar;
        floats[colorOffset + i+j] = color;
    }
});

IDE告诉我的错误是"不能在lambda表达式中使用类似byref类型‘Span’的局部变量‘Floats’"

我试着把Span的构造放在了Questel.For中,但是没有成功.它没有显示错误,但它从未退出并行for循环.

能做到这一点吗?

推荐答案

Span是仅限堆栈的数据 struct ,通过设计,它可以保证保留在堆栈上,不能离开堆栈.您可以在For:

Parallel.For(0, posColBuffer.Length/4, i=>
{
    Span<float> floats = MemoryMarshal.Cast<byte, float>(posColBuffer);
    // ...
});

请注意,您也有floats[i + j]的索引错误,因为它将溢出,如 comments 中的@Matthew Watson所述.

Csharp相关问答推荐

在包含空项的列表上使用具有断言T的摘要表

EF Core:看不到任何查询日志(log)?

使用其可能实现的基类和接口的属性的方法

哪个nuget包含SecurityStampValidatorOptions

读取配置文件(mytest. exe. config)

如何删除文件的基础上嵌入的时间戳嵌入文件名

可为空的泛型属性

与C#中的Zip列表并行

C#和ASP.NET核心标识:提高GetUserAsync调用的性能

TeamsBot SendActivityActivityTypes与ActivityTypes同步.键入不再起作用

未在数据流块之间传播完成

该函数不能检测两条曲线的交点

如何使用用于VS代码的.NET Maui扩展在我的iOS/Android设备或模拟器上进行调试?

有条件地定义预处理器指令常量

用于请求用户返回列表的C#Google API

Xamarin中出错.表单:应用程序的分部声明不能指定不同的基类

与Visual Studio 2022中的.NET框架相比,如何在.NET Core 6中获取错误输出的窗口句柄

无法将.Net Framework 4.8.1升级到.Net 7

Unity 3D-意外轴捕捉和未知力对脉冲react 行为的影响

阻止CLR释放已封送的双字符指针的内存?