나는이 같은 IDisposable
클래스와 Mutex
을 포장하기 위해 노력하고있어 끝나지 :으로 IDisposable와 뮤텍스를 포장하고 테스트하지만 테스트는 결코
public class NamedMutex : IDisposable
{
private static readonly object _syncLock = new object();
private readonly Mutex _namedMutex;
private readonly bool _createdNew;
public NamedMutex(string name)
{
if (string.IsNullOrEmpty(name)) throw new ArgumentNullException("name");
//lock (_syncLock)
{
_namedMutex = new Mutex(initiallyOwned: false, name: name, createdNew: out _createdNew);
}
_namedMutex.WaitOne();
}
public void Dispose()
{
//lock (_syncLock)
{
//if (_createdNew)
_namedMutex.ReleaseMutex();
_namedMutex.Dispose();
}
}
}
당신은 내가했습니다 주석 처리 된 코드에서 볼 수 있듯이 시험을 끝내지 못하기 때문에 위의 구현에 맞지 않거나 뭔가 잘못되었습니다. (아마 죽은 자물쇠는 내가 식별 할 수 없거나 충돌 할 수 있습니다. 비동기 예외).
void Main()
{
var sw = Stopwatch.StartNew();
var task1 = Task.Run(async() =>
{
using (new NamedMutex("foo"))
{
Console.WriteLine(3);
await Task.Delay(TimeSpan.FromSeconds(3));
}
});
var task2 = Task.Run(async() =>
{
using (new NamedMutex("foo"))
{
Console.WriteLine(2);
await Task.Delay(TimeSpan.FromSeconds(2));
}
});
Task.WaitAll(task1, task2);
//Assert.IsTrue(sw.Elapsed.TotalSeconds >= 5);
sw.Elapsed.Dump(); // LINQPad
}
당신은'''NamedMutex'''의 생성자에서 중단 점을 넣고 그것이 이제까지'''_namedMutex.WaitOne()을지나 얻는 경우에 우리에게 말해 줄 수,'''라인? –
@MattThomas 예. 'Console.WriteLine ("WaitOne");'을 추가하면'WaitOne'을 한 번만 출력 한 다음 즉시'3'을 출력하고 영원히 멈추게됩니다. – t3chb0t
방금 Visual Studio에서 이것을 테스트했지만 처음에는 올바르게 작동하지만 이후의 모든 시도는 실패합니다. 그런 다음 mutex의 이름을 변경하면 다시 작동하고 이후의 호출에는 다시 실패합니다. 프로그램 종료 후 mutex가 제대로 처리되지 않는 것 같습니다. –