このスレッドで議論されている内容を要約します。
問題の根本原因:
このCryptographicException
(エラーコード: -1073741816 / STATUS_INVALID_HANDLE) は、System.Security.Cryptography.SHA256
のようなハッシュアルゴリズムのインスタンスがスレッドセーフでないにもかかわらず、複数のスレッドから同時にアクセスされた場合に発生します。最近のWindows Update (KB5037782, KB5037771など) により、これまで潜在的なバグとして存在し、データの破損を引き起こしていた可能性のあったこの問題が、クラッシュとして表面化するようになりました。これは、問題を可視化するという点では改善と言えます。
恒久的な解決策:
最も確実な解決策は、共有されているハッシュアルゴリズムのインスタンスへのアクセスをlock
ステートメントで囲み、一度に一つのスレッドのみがアクセスできるようにコードを修正することです。
コード例 (.NET):
// 共有インスタンスの例
private static readonly SHA256 s_sha256 = SHA256.Create();
private static readonly object s_lock = new object();
public byte[] CalculateHash(byte[] data)
{
// lockを使用してスレッドセーフを保証する
lock (s_lock)
{
return s_sha256.ComputeHash(data);
}
}
// または、毎回新しいインスタンスを生成する(よりシンプルで安全)
public byte[] CalculateHashAlternatively(byte[] data)
{
using (SHA256 sha256 = SHA256.Create())
{
return sha256.ComputeHash(data);
}
}
一時的な回避策:
問題の原因となっているWindows Update (KB503xxxx) をアンインストールすることで、一時的にクラッシュを回避できます。しかし、この方法は推奨されません。なぜなら、根本的なバグ(スレッドセーフでないコード)は残り、データのサイレントな破損を引き起こすリスクが再発する上、システムのセキュリティ脆弱性が放置されるためです。
シーメンス社のTIA PortalやWindows Admin Centerなど、サードパーティ製ソフトウェアでこの問題が発生している場合、ソフトウェア開発元からの修正パッチを待つ必要があります。