C#에서 비동기 잠금으로 간헐적인 파일 액세스 오류를 방지하는 방법은 무엇입니까?
C#의 비동기 잠금을 사용하여 간헐적인 파일 액세스 오류 해결
비동기 잠금, 특히 해시된 URL 및 AsyncDuplicateLock
과 같은 클래스를 사용할 때 간헐적인 파일 액세스 오류가 발생할 수 있습니다. 이는 동시 사전 내에서 부적절한 세마포어 처리로 인해 발생하는 경우가 많습니다. 초기 결함이 있는 접근 방식은 다음과 같습니다.
SemaphoreSlim locker; if (SemaphoreSlims.TryRemove(s, out locker)) { locker.Release(); locker.Dispose(); }
여기서 문제는 세마포어를 해제하기 전에 제거하는 것입니다. 이로 인해 과도한 세마포 이탈이 발생하여 사전에서 제거된 후에도 세마포어가 계속 사용됩니다.
강력한 솔루션은 참조 카운팅을 사용하여 세마포어 수명을 관리합니다.
public sealed class AsyncDuplicateLock { private sealed class RefCounted<T> { public RefCounted(T value) { RefCount = 1; Value = value; } public int RefCount { get; set; } public T Value { get; private set; } } private static readonly Dictionary<object, RefCounted<SemaphoreSlim>> SemaphoreSlims = new Dictionary<object, RefCounted<SemaphoreSlim>>(); private SemaphoreSlim GetOrCreate(object key) { RefCounted<SemaphoreSlim> item; lock (SemaphoreSlims) { if (SemaphoreSlims.TryGetValue(key, out item)) { ++item.RefCount; } else { item = new RefCounted<SemaphoreSlim>(new SemaphoreSlim(1, 1)); SemaphoreSlims[key] = item; } } return item.Value; } public IDisposable Lock(object key) { GetOrCreate(key).Wait(); return new Releaser { Key = key }; } public async Task<IDisposable> LockAsync(object key) { await GetOrCreate(key).WaitAsync().ConfigureAwait(false); return new Releaser { Key = key }; } private sealed class Releaser : IDisposable { public object Key { get; set; } public void Dispose() { RefCounted<SemaphoreSlim> item; lock (SemaphoreSlims) { item = SemaphoreSlims[Key]; --item.RefCount; if (item.RefCount == 0) SemaphoreSlims.Remove(Key); } item.Value.Release(); } } }
이 개정된 코드는 RefCounted<T>
래퍼를 사용하여 세마포어 참조를 추적합니다. 세마포어는 참조 횟수가 0에 도달할 때만 사전에서 제거되어 적절한 릴리스를 보장하고 조기 폐기를 방지하여 간헐적인 파일 액세스 오류를 제거합니다.
위 내용은 C#에서 비동기 잠금으로 간헐적인 파일 액세스 오류를 방지하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











C 언어 함수에 의해 반환 된 값 유형은 무엇입니까? 반환 값을 결정하는 것은 무엇입니까?

STL (정렬, 찾기, 변환 등)의 알고리즘을 효율적으로 사용하려면 어떻게합니까?
