You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

并行复用HMACSHA256引发AccessViolationException问题咨询

关于HMACSHA256多线程复用引发System.AccessViolationException的问题解析

问题背景

我们的新应用运行数分钟或数小时后会随机崩溃,Windows事件查看器显示异常代码0xc0000005(对应System.AccessViolationException)。经多日排查,根源是为了优化性能缓存并复用HMACSHA256实例,被多线程同时访问导致崩溃——全程无业务日志,仅能通过系统错误码定位问题。

更令人困惑的是:

  • 官方文档为何未提及并行访问HMACSHA256会引发AccessViolationException?
  • .NET 6.0起该异常无法被常规try-catch捕获,定位难度极大,文档为何未明确禁止复用(HMAC)SHA256实例?

复现代码

以下代码可立即触发该异常:

var keyString = "abcdefghijklmnopqrstuvwxyz0123456789";
var hmac = new HMACSHA256(Encoding.UTF8.GetBytes(keyString));

var parallelOptions = new ParallelOptions() { MaxDegreeOfParallelism = 4 };

static IEnumerable<string> EnumerateStrings()
{
    while (true)
    {
        yield return "A short string";
        yield return "Lorem ipsum dolor sit amet, consectetur adipiscing elit ...";
    }
}

Parallel.ForEach(EnumerateStrings(),
                 parallelOptions,
                 theString => hmac.ComputeHash(Encoding.UTF8.GetBytes(theString)));

关键说明

  • HMACSHA256及SHA256等哈希算法实例不具备线程安全性,内部维护着哈希计算的状态信息,多线程并发调用ComputeHash会导致状态混乱,进而触发内存访问违规异常
  • .NET 6.0开始,AccessViolationException被归类为致命异常,常规try-catch无法捕获,进程会直接崩溃
  • 官方文档虽未用醒目标注禁止复用,但在类的线程安全说明中明确标注为Not thread safe,隐含了不可多线程共享实例的要求

内容的提问来源于stack exchange,提问作者frakon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 21:10:33