Exemple #1
0
 private static bool DisposeClassTest()
 {
     using (var disposeClass = new DisposeClass())
     {
         Console.WriteLine($@"DisposeClass test: {disposeClass}");
     }
     return(DisposeClass.DisposedFlag);
 }
Exemple #2
0
    private void Main()
    {
        //DisposableTestFunc();

        Create();
        Console.WriteLine("After created");
        CallGC();

        //如上运行的结果如下:
        //After created!
        //Destructor called!
        //结论:
        //显然在出了Create函数外,myClass对象的析构函数没有被立刻调用,而是等显示调用GC.Collect才被调用。


        //对于Dispose来说,也需要显示的调用,但是对于继承了IDisposable的类型对象可以使用using这个关键字,这样对象的Dispose方法在出了using范围后会被自动调用。例如:
        using (DisposeClass t = new DisposeClass())
        {
        }
        //如上运行的结果如下:
        ///Dispose called
    }
Exemple #3
0
        public static void ApplicationStart(
            Func <Form> newForm, CultureInfo culture, bool isSingle, string mutexName)
        {
            // catchされなかった例外を処理するためのイベントハンドラを追加

            // ThreadExceptionのイベントハンドラ(UIスレッドでcatchされなかった例外用)
            Application.ThreadException
                += new ThreadExceptionEventHandler(Handling_ThreadException);

            // UnhandledExceptionのイベントハンドラ(UIスレッド以外のでcatchされなかった例外用)
            Thread.GetDomain().UnhandledException
                += new UnhandledExceptionEventHandler(Handling_UnhandledException);

            // 言語の設定
            if (culture != null)
            {
                Thread.CurrentThread.CurrentUICulture = culture;
            }

            // NULLチェック
            if (newForm == null)
            {
                throw new ArgumentNullException(nameof(newForm));
            }
            else if (isSingle && string.IsNullOrWhiteSpace(mutexName))
            {
                throw new ArgumentNullException(nameof(mutexName));
            }

            // アプリケーションの実行
            bool  hasMutexOwnership = false;
            Mutex mutex             = null;

            try
            {
                // 二重起動防止用のMutexオブジェクトを所有権を取得する形式で生成
                // 二重起動を防止しない場合は生成しない
                if (isSingle)
                {
                    mutex = new Mutex(true, mutexName, out hasMutexOwnership);
                }

                // 二重起動を防止する場合かつ、Mutexの所有権が得られない場合は既に起動済みと判断し終了する
                if (isSingle && !hasMutexOwnership)
                {
                    Utility.MessageBox.ShowAttention(ErrorMessage.DoubleStartupImpossibleMessage);
                    return;
                }

                while (true)
                {
                    // 言語の変更プロパティをリセット
                    ChangeCulture = null;

                    // Formの起動処理
                    Application.Run(newForm());

                    // 言語の変更プロパティが設定されているか判定
                    if (ChangeCulture == null)
                    {
                        // 言語の変更でない場合は、終了する
                        break;
                    }
                    else
                    {
                        // 言語の変更でない場合は、変更後の言語を設定し再起動する
                        Thread.CurrentThread.CurrentUICulture = ChangeCulture;
                    }
                }
            }
            finally
            {
                // リソースの解放処理を行う
                try
                {
                    // 非同期処理の停止等のため登録されてるDispose対象のクラスについてDisposeを行う
                    for (int i = 0; i < DisposeClass.Count; i++)
                    {
                        DisposeClass[i].Dispose();
                    }

                    // Dispose対象のクラスを格納している配列を解放
                    DisposeClass.Clear();

                    // Mutexの所有権を保持している場合、所有権を解放する
                    if (hasMutexOwnership)
                    {
                        mutex?.ReleaseMutex();
                    }
                }
                catch (Exception ex)
                    when(ex is ApplicationException ||
                         ex is ObjectDisposedException)
                    {
                        // 下記のエラーの場合はMutexオブジェ区の破棄が完了しているためなにもしない
                        // [ApplicationException]
                        // ・呼び出しスレッドに独自のミューテックスが存在しない場合に発生
                        // 下記の
                        // [ObjectDisposedException]
                        // ・Mutexオブジェクトが既に破棄されている場合に発生
                    }
                finally
                {
                    // Mutexオブジェクトを解放する
                    mutex?.Close();
                }
            }
        }
Exemple #4
0
 private void Create()
 {
     DisposeClass myClass = new DisposeClass();
 }