Warum kann ich nach einer Aufgabe keine verlassene Mutexzeption fangen?C#

Ein Treffpunkt für C#-Programmierer
Guest
 Warum kann ich nach einer Aufgabe keine verlassene Mutexzeption fangen?

Post by Guest »

Ich hatte erwartet, eine verlassene Mutexception nach einer Aufgabe auszulösen, die den Mutex nicht freigibt. Das Programm steckte nach der Aufgabe WaitOne nach der Aufgabe:

Code: Select all

Mutex mutex = new();

BankAccount account = new();

var task = Task.Run(() =>
{
bool locked = false;
try
{
locked = mutex.WaitOne();
if (locked) account.Deposit(100);
}
finally
{
// if (locked) mutex.ReleaseMutex();
}
});

task.Wait();

try
{
_ = mutex.WaitOne(); // it waits here forever
}
catch (AbandonedMutexException)
{
Console.WriteLine($"{nameof(AbandonedMutexException)} was thrown");
}

public class BankAccount
{
public int Balance { get; private set; }
public void Deposit(int amount) => Balance += amount;
public void Withdraw(int amount) => Balance -= amount;
}
Es kann jedoch nach einem Thread erwischt werden :
Mutex mutex = new();

BankAccount account = new();

new Thread(() =>
{
bool locked = false;
try
{
locked = mutex.WaitOne();
if (locked) account.Deposit(100);
}
finally
{
// if (locked) mutex.ReleaseMutex();
}
}).Start();

Thread.Sleep(1000);

try
{
_ = mutex.WaitOne();
}
catch (AbandonedMutexException)
{
// caught successfully
Console.WriteLine($"{nameof(AbandonedMutexException)} was thrown");
}
< /code>
Was verursacht ein solcher Unterschied? Ist die Aufgabe nicht ein Wrapper für Thread?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post