为什么抛出应用程序异常

本文关键字:异常 应用程序 为什么 | 更新日期: 2023-09-27 18:32:46

我只是在Mutex上进行实验并编写了以下代码。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace Mutex_WaitOnewithTimeouts
{
    class Program
    {
        private static Mutex mut = new Mutex();
        private static int numOfThreads = 5;
        private static int numOfIterations = 3;
        private static Random rand = new Random();
        static void Main(string[] args)
        {
            Thread[] threads = new Thread[5];
            for (int num = 0; num < numOfThreads; num++)
            {
                threads[num] = new Thread(new ThreadStart(MyThreadProc));
                threads[num].Name = String.Format("Thread{0}", num);
                threads[num].Start();
            }
            Console.Read();
        }
        private static void MyThreadProc()
        {
            for (int iteration = 0; iteration < numOfIterations; iteration++)
            {
                UseResource();
            }
        }
        private static void UseResource()
        {
            Console.WriteLine("{0} accessing ", Thread.CurrentThread.Name);
            int time = (int)(rand.NextDouble() * 100);
            try
            {
                if (mut.WaitOne(time))
                {
                    Console.WriteLine("Yippie got mutex for {0}", Thread.CurrentThread.Name);
                    Thread.Sleep((int)rand.NextDouble() * 5000);
                }
                else
                {
                    Console.WriteLine("Nopee.... Timeout occured for {0}", Thread.CurrentThread.Name);
                }
            }
            catch (AbandonedMutexException ex)
            {
                Console.WriteLine(" Exception is caught");
            }
            finally 
            {
                Console.WriteLine("Releasing mutex for {0}", Thread.CurrentThread.Name);
               mut.ReleaseMutex();
            }
        }
    }
}

但是我有时会收到应用程序异常。如果我的代码有任何问题,有人可以帮我吗,也请解释何时触发此异常。

对象同步方法是从未同步的代码块调用的。我在尝试释放互斥锁时在最后一个块中得到这个。

为什么抛出应用程序异常

即使 WaitOne 失败,您也会释放互斥锁。 将 ReleaseMutex 调用移到 if 语句中,从那里知道您已经获得了互斥锁。

@John的答案是正确的,但对于后代来说,我认为更好的模式是在if中将布尔值设置为真,然后仍然在finally块中执行release,但这次仅在布尔值为真时才这样做。 问题是,如果抛出任何if子句,那么互斥锁将不会释放。 我假设你会在if子句中添加更多内容,而不仅仅是写作和睡眠。

如果可以,您总是希望使用try { ... } finally模式,但只需防止waitOne()调用返回 false。 如下所示:

bool release = false;
try {
    if (mut.waitOne(time)) {
        release = true;
        ...
    } else {
        ...
    }
} catch (AbandonedMutexException ex) {
    ...
} finally {
    ...
    if (release) {
        mut.ReleaseMutex();
    }
}