Thread.SetData メソッド
アセンブリ: mscorlib (mscorlib.dll 内)


![]() |
---|
このメソッドに適用される HostProtectionAttribute 属性の Resources プロパティの値は、SharedState または ExternalThreading です。HostProtectionAttribute は、デスクトップ アプリケーション (一般的には、アイコンをダブルクリック、コマンドを入力、またはブラウザに URL を入力して起動するアプリケーション) には影響しません。詳細については、HostProtectionAttribute クラスのトピックまたは「SQL Server プログラミングとホスト保護属性」を参照してください。 |
スレッドは、ローカル ストア メモリ機構を使用して、スレッド固有のデータを格納します。共通言語ランタイムは、各プロセスの作成時に、そのプロセスにマルチスロットのデータ ストア配列を割り当てます。スレッドは、データ ストアのデータ スロットを割り当てたり、スロットにデータ値を格納および取得したり、スレッド プロシージャが終了してガベージ コレクションによって Thread オブジェクトがクリアされた後でスロットを解放して再利用できるようにしたりできます。データ スロットはスレッドごとに一意です。他のスレッドは (子スレッドであっても) そのデータを取得できません。

名前付きデータ スロットにスレッド固有の情報を格納する方法の例を次に示します。
Option Explicit Option Strict Imports System Imports System.Threading Class Test <MTAThread> _ Shared Sub Main() Dim newThreads(3) As Thread For i As Integer = 0 To newThreads.Length - 1 newThreads(i) = New Thread(AddressOf SlotExample.SlotTest) newThreads(i).Start() Next i End Sub End Class Public Class SlotExample Shared randomGenerator As Random = New Random() Shared Sub SlotTest() ' Set different data in each thread's data slot. Thread.SetData( _ Thread.GetNamedDataSlot("Random"), _ randomGenerator.Next(1, 200)) ' Write the data from each thread's data slot. Console.WriteLine("Data in thread_{0}'s data slot: {1,3}", _ AppDomain.GetCurrentThreadId().ToString(), _ Thread.GetData( _ Thread.GetNamedDataSlot("Random")).ToString()) ' Allow other threads time to execute SetData to show ' that a thread's data slot is unique to the thread. Thread.Sleep(1000) Console.WriteLine("Data in thread_{0}'s data slot is still: {1,3}", _ AppDomain.GetCurrentThreadId().ToString(), _ Thread.GetData( _ Thread.GetNamedDataSlot("Random")).ToString()) ' Allow time for other threads to show their data, ' then demonstrate that any code a thread executes ' has access to the thread's named data slot. Thread.Sleep(1000) Dim o As New Other() o.ShowSlotData() End Sub End Class Public Class Other Public Sub ShowSlotData() ' This method has no access to the data in the SlotExample ' class, but when executed by a thread it can obtain ' the thread's data from a named slot. Console.WriteLine("Other code displays data in thread_{0}'s data slot: {1,3}", _ AppDomain.GetCurrentThreadId().ToString(), _ Thread.GetData( _ Thread.GetNamedDataSlot("Random")).ToString()) End Sub End Class
using System; using System.Threading; class Test { static void Main() { Thread[] newThreads = new Thread[4]; for(int i = 0; i < newThreads.Length; i++) { newThreads[i] = new Thread(new ThreadStart(Slot.SlotTest)); newThreads[i].Start(); } } } class Slot { static Random randomGenerator = new Random(); public static void SlotTest() { // Set different data in each thread's data slot. Thread.SetData( Thread.GetNamedDataSlot("Random"), randomGenerator.Next(1, 200)); // Write the data from each thread's data slot. Console.WriteLine("Data in thread_{0}'s data slot: {1,3}", AppDomain.GetCurrentThreadId().ToString(), Thread.GetData( Thread.GetNamedDataSlot("Random")).ToString()); // Allow other threads time to execute SetData to show // that a thread's data slot is unique to the thread. Thread.Sleep(1000); Console.WriteLine("Data in thread_{0}'s data slot is still: {1,3}", AppDomain.GetCurrentThreadId().ToString(), Thread.GetData( Thread.GetNamedDataSlot("Random")).ToString()); // Allow time for other threads to show their data, // then demonstrate that any code a thread executes // has access to the thread's named data slot. Thread.Sleep(1000); Other o = new Other(); o.ShowSlotData(); } } public class Other { public void ShowSlotData() { // This method has no access to the data in the Slot // class, but when executed by a thread it can obtain // the thread's data from a named slot. Console.WriteLine("Other code displays data in thread_{0}'s data slot: {1,3}", AppDomain.GetCurrentThreadId().ToString(), Thread.GetData( Thread.GetNamedDataSlot("Random")).ToString()); } }
using namespace System; using namespace System::Threading; ref class Other { public: void ShowSlotData() { // This method has no access to the data in the Slot // class, but when executed by a thread it can obtain // the thread's data from a named slot. Console::WriteLine( "Other code displays data in thread_{0}'s data slot: {1,3}", AppDomain::GetCurrentThreadId(), Thread::GetData( Thread::GetNamedDataSlot( "Random" ) )->ToString() ); } }; ref class Slot { private: static Random^ randomGenerator = gcnew Random; public: static void SlotTest() { // Set different data in each thread's data slot. Thread::SetData( Thread::GetNamedDataSlot( "Random" ), randomGenerator->Next( 1, 200 ) ); // Write the data from each thread's data slot. Console::WriteLine( "Data in thread_{0}'s data slot: {1,3}", AppDomain::GetCurrentThreadId().ToString(), Thread::GetData( Thread::GetNamedDataSlot( "Random" ) )->ToString() ); // Allow other threads time to execute SetData to show // that a thread's data slot is unique to the thread. Thread::Sleep( 1000 ); Console::WriteLine( "Data in thread_{0}'s data slot is still: {1,3}", AppDomain::GetCurrentThreadId().ToString(), Thread::GetData( Thread::GetNamedDataSlot( "Random" ) )->ToString() ); // Allow time for other threads to show their data, // then demonstrate that any code a thread executes // has access to the thread's named data slot. Thread::Sleep( 1000 ); Other^ o = gcnew Other; o->ShowSlotData(); } }; int main() { array<Thread^>^newThreads = gcnew array<Thread^>(4); for ( int i = 0; i < newThreads->Length; i++ ) { newThreads[ i ] = gcnew Thread( gcnew ThreadStart( &Slot::SlotTest ) ); newThreads[ i ]->Start(); } }
import System.*; import System.Threading.*; import System.Threading.Thread; class Test { public static void main(String[] args) { Thread newThreads[] = new Thread[4]; for (int i = 0; i < newThreads.length; i++) { newThreads[i] = new Thread(new ThreadStart(Slot.SlotTest)); newThreads[i].Start(); } } //main } //Test class Slot { private static Random randomGenerator = new Random(); public static void SlotTest() { // Set different data in each thread's data slot. Thread.SetData(Thread.GetNamedDataSlot("Random"), new Integer(randomGenerator.Next(1, 200))); // Write the data from each thread's data slot. Console.WriteLine("Data in thread_{0}'s data slot: {1,3}", String.valueOf(AppDomain.GetCurrentThreadId()), Thread.GetData(Thread.GetNamedDataSlot("Random")).toString()); // Allow other threads time to execute SetData to show // that a thread's data slot is unique to the thread. Thread.Sleep(1000); Console.WriteLine("Data in thread_{0}'s data slot is still: {1,3}", String.valueOf(AppDomain.GetCurrentThreadId()), Thread.GetData(Thread.GetNamedDataSlot("Random")).toString()); // Allow time for other threads to show their data, // then demonstrate that any code a thread executes // has access to the thread's named data slot. Thread.Sleep(1000); Other o = new Other(); o.ShowSlotData(); } //SlotTest } //Slot public class Other { public void ShowSlotData() { // This method has no access to the data in the Slot // class, but when executed by a thread it can obtain // the thread's data from a named slot. Console.WriteLine("Other code displays data in " + "thread_{0}'s data slot: {1,3}", String.valueOf(AppDomain.GetCurrentThreadId()), Thread.GetData(Thread.GetNamedDataSlot("Random")).ToString()); } //ShowSlotData } //Other

Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile for Pocket PC, Windows Mobile for Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
開発プラットフォームの中には、.NET Framework によってサポートされていないバージョンがあります。サポートされているバージョンについては、「システム要件」を参照してください。


Weblioに収録されているすべての辞書からThread.SetData メソッドを検索する場合は、下記のリンクをクリックしてください。

- Thread.SetData メソッドのページへのリンク