[ VB.NET / C# ] スレッドの中断と再開APIは廃止 ( Resume / Suspend )

Pocket

.Net Framework 3.5 までは、Thread.Resume および、Thread.Suspend メソッドは互換性のために残されていましたが、.Net Framework 4.0 以降では廃止されています。残念なお知らせです。以前からマイクロソフトでは、互換性のために残されていると注意喚起はしていたのですが、実際に廃止されると結構ダメージを受けることもあります。

スポンサーリンク


なお .Net Framework4.0 以降、無条件に廃止されているわけではなく、Visual Studio 2010 (v100) までは互換性のために残されていますが、Visual Studio 2012 (v110) から廃止されているようです。Visual Studio のバージョンも関係あるようで、なかなか細かいようです。

参考:MSDN:Thread メソッド

廃止されたスレッドの中断と再開

互換性のために残されてたスレッドの中断と再開を行う Thread.Suspend メソッドと Thread.Resume メソッドは使用できなくなりましたので、以下のようなコードは記述できなくなりました。

早め早めの対策を心掛けたいものですが、なかなか腰があがりません。お金もありません。「ノーマネーでフィニッシュです」と言われるとそこで試合終了です。

VB.NET

Imports System.Threading

Class Test

    Public Shared Sub Main()

        ' スレッドの作成
        Dim t As New Thread(New ThreadStart(AddressOf TestThread))

        t.Start()          ' スレッドの開始

        Thread.Sleep(50)   ' 50ミリ秒スリープ

        Console.WriteLine("suspend thread")
        t.Suspend()        ' スレッドの停止

        Thread.Sleep(1000) ' 1秒スリープ

        Console.WriteLine("resume thread")
        t.Resume()         ' スレッドの再開

        Console.ReadKey()

    End Sub

    ''<summary>スレッドとして動作するメソッド</summary>
    Private Shared Sub TestThread()

        For i As Integer = 0 To 99
            Thread.Sleep(5)             ' 5ミリ秒スリープ
            Console.Write(i.ToString()) ' 現在のカウンタを出力
        Next

    End Sub
End Class

C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Threading;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            // スレッドの作成
            Thread t = new Thread(new ThreadStart(TestThread));

            t.Start();          // スレッドの開始
            Thread.Sleep(50);   // 50ミリ秒スリープ

            Console.WriteLine("suspend thread");
            t.Suspend();        // スレッドの停止

            Thread.Sleep(1000); // 1秒スリープ

            Console.WriteLine("resume thread");
            t.Resume();         // スレッドの再開

            Console.ReadKey();
        }

        //<summary>スレッドとして動作するメソッド</summary>
        static void TestThread()
        {
            for (int i = 0; i < 100; i++)
            {
                Thread.Sleep(5);                 // 5ミリ秒スリープ
                Console.WriteLine(i.ToString()); // 現在のカウンタを出力する
            }
        }
    }
}
スポンサーリンク


Pocket

Leave a Comment

Your email address will not be published. Required fields are marked *