DoboWiki
Top
> .NETプログラミング研究/23 をテンプレートにして作成
.NETプログラミング研究/23 をテンプレートにして作成
開始行:
#title(.NETプログラミング研究 第23号)
#navi(.NETプログラミング研究)
#contents
*.NETプログラミング研究 第23号 [#tb7e7602]
**.NET Tips [#ubd0d0bf]
**.NETのマルチスレッドプログラミング その5 [#je1dbcec]
#column(注意){{
この記事の最新版は「[[.NETのマルチスレッドプログラミング>...
}}
***スレッドプールの使い方 [#qa6096b3]
(ここではスレッドプールの使い方について説明することが目...
-[[スレッド プーリング>http://www.microsoft.com/japan/msd...
-[[スレッド プール>http://www.microsoft.com/japan/msdn/li...
)
.NET Frameworkで新しいスレッドを作成し実行するには、Threa...
スレッドプールのキューにメソッドを追加するには、ThreadPoo...
それでは実際にThreadPool.QueueUserWorkItemメソッドを使用...
#code(vbnet){{
'Imports System.Threading
'が宣言されているものとする
Class MainClass
'エントリポイント
Public Shared Sub Main()
Dim i As Integer
For i = 0 To 9
'メソッドをスレッドプールのキューに追加する
ThreadPool.QueueUserWorkItem( _
New WaitCallback(AddressOf MyProc))
Next i
End Sub
'スレッドで実行するメソッド
Private Shared Sub MyProc(ByVal state As Object)
Console.WriteLine("こんにちは。")
End Sub
End Class
}}
#code(csharp){{
//using System.Threading;
//が宣言されているものとする
class MainClass
{
//エントリポイント
public static void Main()
{
for (int i = 0; i < 10; i++)
{
//メソッドをスレッドプールのキューに追加する
ThreadPool.QueueUserWorkItem(new WaitCallback(MyProc));
}
}
//スレッドで実行するメソッド
private static void MyProc(object state)
{
Console.WriteLine("こんにちは。");
}
}
}}
QueueUserWorkItemメソッドの特徴の一つは、指定するメソッド...
次に状態オブジェクトを利用してデータの授受を行う例を示し...
#code(vbnet){{
'Imports System.Threading
'が宣言されているものとする
'状態オブジェクトのためのクラス
Class TaskInfo
'メソッドに渡すデータ
Public StringValue As String
'メソッドからの返り値
Public Result As String
'コンストラクタ
Public Sub New(ByVal str As String)
StringValue = str
End Sub
End Class
Class MainClass
'エントリポイント
Public Shared Sub Main()
'TaskInfoオブジェクトを10個作る
Dim tis(10) As TaskInfo
Dim i As Integer
For i = 0 To tis.Length - 1
tis(i) = New TaskInfo(i.ToString())
Next i
For i = 0 To tis.Length - 1
'メソッドをスレッドプールのキューに追加する
'この時、状態オブジェクトも指定する
ThreadPool.QueueUserWorkItem( _
New WaitCallback(AddressOf PrintData), ti...
Next i
'待機する
Console.ReadLine()
'結果を表示
For i = 0 To tis.Length - 1
Console.WriteLine(tis(i).Result)
Next i
Console.ReadLine()
End Sub
'スレッドで実行するメソッド
Private Shared Sub PrintData(ByVal state As Object)
'渡されたデータを取得
Dim ti As TaskInfo = CType(state, TaskInfo)
'取得したデータを表示
Dim i As Integer
For i = 0 To 999
Console.Write("{0}{1}", ti.StringValue, i)
Next i '結果を格納
ti.Result = ti.StringValue + ":END"
End Sub
End Class
}}
#code(csharp){{
//using System.Threading;
//が宣言されているものとする
//状態オブジェクトのためのクラス
class TaskInfo
{
//メソッドに渡すデータ
public string StringValue;
//メソッドからの返り値
public string Result;
//コンストラクタ
public TaskInfo(string str)
{
StringValue = str;
}
}
class MainClass
{
//エントリポイント
public static void Main()
{
//TaskInfoオブジェクトを10個作る
TaskInfo[] tis = new TaskInfo[10];
for (int i = 0; i < tis.Length; i++)
{
tis[i] = new TaskInfo(i.ToString());
}
for (int i = 0; i < tis.Length; i++)
{
//メソッドをスレッドプールのキューに追加する
//この時、状態オブジェクトも指定する
ThreadPool.QueueUserWorkItem(
new WaitCallback(PrintData), tis[i]);
}
//待機する
Console.ReadLine();
//結果を表示
for (int i = 0; i < tis.Length; i++)
{
Console.WriteLine(tis[i].Result);
}
Console.ReadLine();
}
//スレッドで実行するメソッド
private static void PrintData(object state)
{
//渡されたデータを取得
TaskInfo ti = (TaskInfo) state;
//取得したデータを表示
for (int i = 0; i < 1000; i++)
Console.Write("{0}{1}", ti.StringValue, i);
//結果を格納
ti.Result = ti.StringValue + ":END";
}
}
}}
ThreadPoolオブジェクトは一つのプロセスに一つだけ存在し、T...
スレッドプールはとても便利ですが、Threadクラスと違い、優...
なお、ThreadPoolクラスにはUnsafeQueueUserWorkItemというメ...
(注1:この数は変更できるとヘルプにあります。しかし、実際...
-[[The Code Project - Changing the default limit of 25 th...
-[[C# Corner - Changing the default limit of 25 threads o...
)
***ThreadPool.RegisterWaitForSingleObjectの使い方 [#a9e88...
続いては、ThreadPool.RegisterWaitForSingleObjectメソッド...
QueueUserWorkItemメソッドと比較した場合のRegisterWaitForS...
RegisterWaitForSingleObjectメソッドは、指定したWaitHandle...
次の例ではRegisterWaitForSingleObjectメソッドで10個のデリ...
#code(vbnet){{
'Imports System.Threading
'が宣言されているものとする
Class MainClass
'エントリポイント
Public Shared Sub Main()
'非シグナル状態でManualResetEventを作成
Dim ev As New ManualResetEvent(False)
Dim i As Integer
For i = 0 To 9
'デリゲートをキューに追加する
ThreadPool.RegisterWaitForSingleObject( _
ev, _
New WaitOrTimerCallback(AddressOf PrintTi...
Nothing, _
-1, _
True)
Next i
'待機する
Console.WriteLine("Enterキーを押してね")
Console.ReadLine()
'ManualResetEventをシグナル状態にする
ev.Set()
Console.ReadLine()
End Sub
'システム起動後の経過時間を表示
Private Shared Sub PrintTime(ByVal state As Object, _
ByVal timedOut As Boolean)
Console.WriteLine("システム起動後の経過時間:{0}ミ...
System.Environment.TickCount)
End Sub
End Class
}}
#code(csharp){{
//using System.Threading;
//が宣言されているものとする
class MainClass
{
//エントリポイント
public static void Main()
{
//非シグナル状態でManualResetEventを作成
ManualResetEvent ev = new ManualResetEvent(false);
for (int i = 0; i < 10; i++)
{
//デリゲートをキューに追加する
ThreadPool.RegisterWaitForSingleObject(
ev,
new WaitOrTimerCallback(PrintTime),
null,
-1,
true
);
}
//待機する
Console.WriteLine("Enterキーを押してね");
Console.ReadLine();
//ManualResetEventをシグナル状態にする
ev.Set();
Console.ReadLine();
}
//システム起動後の経過時間を表示
private static void PrintTime(object state, bool timedOut)
{
Console.WriteLine("システム起動後の経過時間:{0}ミリ秒",
System.Environment.TickCount);
}
}
}}
さらに、タイムアウトする時間を4番目の引数に指定してRegist...
また、RegisterWaitForSingleObjectメソッドの5番目の引数をf...
WaitOrTimerCallbackデリゲートの2番目の引数から、そのメソ...
次の例ではPrintTimeメソッドが1秒おきに実行されるようにし...
#code(vbnet){{
'Imports System.Threading
'が宣言されているものとする
Class MainClass
'エントリポイント
Public Shared Sub Main()
'非シグナル状態でAutoResetEventを作成
Dim ev As New AutoResetEvent(False)
'デリゲートをキューに追加する
'1秒おきに実行する
ThreadPool.RegisterWaitForSingleObject( _
ev, _
New WaitOrTimerCallback(AddressOf PrintTime), _
Nothing, _
1000, _
False)
Dim i As Integer
For i = 0 To 9
'3秒待機する
Thread.Sleep(3000)
'AutoResetEventをシグナル状態にする
ev.Set()
Next i
Console.ReadLine()
End Sub
'システム起動後の経過時間を表示
Private Shared Sub PrintTime(ByVal state As Object, _
ByVal timedOut As Boolean)
Console.WriteLine("システム起動後の経過時間:{0}ミ...
System.Environment.TickCount, timedOut)
End Sub
End Class
}}
#code(csharp){{
//using System.Threading;
//が宣言されているものとする
class MainClass
{
//エントリポイント
public static void Main()
{
//非シグナル状態でAutoResetEventを作成
AutoResetEvent ev = new AutoResetEvent(false);
//デリゲートをキューに追加する
//1秒おきに実行する
ThreadPool.RegisterWaitForSingleObject(
ev,
new WaitOrTimerCallback(PrintTime),
null,
1000,
false
);
for (int i = 0; i < 10; i++)
{
//3秒待機する
Thread.Sleep(3000);
//AutoResetEventをシグナル状態にする
ev.Set();
}
Console.ReadLine();
}
//システム起動後の経過時間を表示
private static void PrintTime(object state, bool timedOut)
{
Console.WriteLine("システム起動後の経過時間:{0}ミリ秒({...
System.Environment.TickCount,
timedOut);
}
}
}}
結果は例えば次のようになります。
#pre{{
システム起動後の経過時間:5140281ミリ秒(True)
システム起動後の経過時間:5141272ミリ秒(True)
システム起動後の経過時間:5142274ミリ秒(True)
システム起動後の経過時間:5142274ミリ秒(False)
システム起動後の経過時間:5143275ミリ秒(True)
システム起動後の経過時間:5144277ミリ秒(True)
システム起動後の経過時間:5145278ミリ秒(True)
システム起動後の経過時間:5145278ミリ秒(False)
システム起動後の経過時間:5146279ミリ秒(True)
システム起動後の経過時間:5147281ミリ秒(True)
...(以下省略)...
}}
WaitHandleがシグナル状態になるまで、またはタイムアウトす...
Unregisterメソッドと、さらに状態オブジェクトを使った例を...
Unregister(null);
により、それ以上は実行されなくなります。
#code(vbnet){{
'Imports System.Threading
'が宣言されているものとする
'状態オブジェクトのためのクラス
Class TaskInfo
'待機操作のためのRegisteredWaitHandle
Public Handle As RegisteredWaitHandle = Nothing
'メソッドに渡すデータ
Public StringValue As String
Public Sub New(ByVal str As String)
StringValue = str
End Sub
End Class
Class MainClass
'エントリポイント
Public Shared Sub Main()
'TaskInfoオブジェクトの作成
Dim ti As New TaskInfo("1")
'非シグナル状態でAutoResetEventを作成
Dim ev As New AutoResetEvent(False)
'デリゲートをキューに追加する
'状態オブジェクトを指定して、1秒おきに実行する
ti.Handle = ThreadPool.RegisterWaitForSingleObjec...
ev, _
New WaitOrTimerCallback(AddressOf PrintTime), _
ti, _
1000, _
False)
'待機
Console.ReadLine()
'AutoResetEventをシグナル状態にする
ev.Set()
Console.ReadLine()
End Sub
'システム起動後の経過時間を表示
Private Shared Sub PrintTime(ByVal state As Object, _
ByVal timedOut As Boolean)
'状態オブジェクトの取得
Dim ti As TaskInfo = CType(state, TaskInfo)
'表示
Console.WriteLine("システム起動後の経過時間:{0}ミ...
System.Environment.TickCount, timedOut)
'シグナルが送信されたら
'コールバックメソッドが実行されないように
'待機操作をキャンセルする
If Not timedOut And Not (ti.Handle Is Nothing) Then
ti.Handle.Unregister(Nothing)
End If
End Sub
End Class
}}
#code(csharp){{
//using System.Threading;
//が宣言されているものとする
//状態オブジェクトのためのクラス
class TaskInfo
{
//待機操作のためのRegisteredWaitHandle
public RegisteredWaitHandle Handle = null;
//メソッドに渡すデータ
public string StringValue;
public TaskInfo(string str)
{
StringValue = str;
}
}
class MainClass
{
//エントリポイント
public static void Main()
{
//TaskInfoオブジェクトの作成
TaskInfo ti = new TaskInfo("1");
//非シグナル状態でAutoResetEventを作成
AutoResetEvent ev = new AutoResetEvent(false);
//デリゲートをキューに追加する
//状態オブジェクトを指定して、1秒おきに実行する
ti.Handle = ThreadPool.RegisterWaitForSingleObject(
ev,
new WaitOrTimerCallback(PrintTime),
ti,
1000,
false
);
//待機
Console.ReadLine();
//AutoResetEventをシグナル状態にする
ev.Set();
Console.ReadLine();
}
//システム起動後の経過時間を表示
private static void PrintTime(object state, bool timedOut)
{
//状態オブジェクトの取得
TaskInfo ti = (TaskInfo) state;
//表示
Console.WriteLine("システム起動後の経過時間:{0}ミリ秒({...
System.Environment.TickCount,
timedOut);
//シグナルが送信されたら
//コールバックメソッドが実行されないように
//待機操作をキャンセルする
if (!timedOut && ti.Handle != null)
ti.Handle.Unregister(null);
}
}
}}
**コメント [#pd1dbf34]
#comment
//これより下は編集しないでください
#pageinfo([[:Category/.NET]],2003-12-15 (月) 06:00:00,DOB...
終了行:
#title(.NETプログラミング研究 第23号)
#navi(.NETプログラミング研究)
#contents
*.NETプログラミング研究 第23号 [#tb7e7602]
**.NET Tips [#ubd0d0bf]
**.NETのマルチスレッドプログラミング その5 [#je1dbcec]
#column(注意){{
この記事の最新版は「[[.NETのマルチスレッドプログラミング>...
}}
***スレッドプールの使い方 [#qa6096b3]
(ここではスレッドプールの使い方について説明することが目...
-[[スレッド プーリング>http://www.microsoft.com/japan/msd...
-[[スレッド プール>http://www.microsoft.com/japan/msdn/li...
)
.NET Frameworkで新しいスレッドを作成し実行するには、Threa...
スレッドプールのキューにメソッドを追加するには、ThreadPoo...
それでは実際にThreadPool.QueueUserWorkItemメソッドを使用...
#code(vbnet){{
'Imports System.Threading
'が宣言されているものとする
Class MainClass
'エントリポイント
Public Shared Sub Main()
Dim i As Integer
For i = 0 To 9
'メソッドをスレッドプールのキューに追加する
ThreadPool.QueueUserWorkItem( _
New WaitCallback(AddressOf MyProc))
Next i
End Sub
'スレッドで実行するメソッド
Private Shared Sub MyProc(ByVal state As Object)
Console.WriteLine("こんにちは。")
End Sub
End Class
}}
#code(csharp){{
//using System.Threading;
//が宣言されているものとする
class MainClass
{
//エントリポイント
public static void Main()
{
for (int i = 0; i < 10; i++)
{
//メソッドをスレッドプールのキューに追加する
ThreadPool.QueueUserWorkItem(new WaitCallback(MyProc));
}
}
//スレッドで実行するメソッド
private static void MyProc(object state)
{
Console.WriteLine("こんにちは。");
}
}
}}
QueueUserWorkItemメソッドの特徴の一つは、指定するメソッド...
次に状態オブジェクトを利用してデータの授受を行う例を示し...
#code(vbnet){{
'Imports System.Threading
'が宣言されているものとする
'状態オブジェクトのためのクラス
Class TaskInfo
'メソッドに渡すデータ
Public StringValue As String
'メソッドからの返り値
Public Result As String
'コンストラクタ
Public Sub New(ByVal str As String)
StringValue = str
End Sub
End Class
Class MainClass
'エントリポイント
Public Shared Sub Main()
'TaskInfoオブジェクトを10個作る
Dim tis(10) As TaskInfo
Dim i As Integer
For i = 0 To tis.Length - 1
tis(i) = New TaskInfo(i.ToString())
Next i
For i = 0 To tis.Length - 1
'メソッドをスレッドプールのキューに追加する
'この時、状態オブジェクトも指定する
ThreadPool.QueueUserWorkItem( _
New WaitCallback(AddressOf PrintData), ti...
Next i
'待機する
Console.ReadLine()
'結果を表示
For i = 0 To tis.Length - 1
Console.WriteLine(tis(i).Result)
Next i
Console.ReadLine()
End Sub
'スレッドで実行するメソッド
Private Shared Sub PrintData(ByVal state As Object)
'渡されたデータを取得
Dim ti As TaskInfo = CType(state, TaskInfo)
'取得したデータを表示
Dim i As Integer
For i = 0 To 999
Console.Write("{0}{1}", ti.StringValue, i)
Next i '結果を格納
ti.Result = ti.StringValue + ":END"
End Sub
End Class
}}
#code(csharp){{
//using System.Threading;
//が宣言されているものとする
//状態オブジェクトのためのクラス
class TaskInfo
{
//メソッドに渡すデータ
public string StringValue;
//メソッドからの返り値
public string Result;
//コンストラクタ
public TaskInfo(string str)
{
StringValue = str;
}
}
class MainClass
{
//エントリポイント
public static void Main()
{
//TaskInfoオブジェクトを10個作る
TaskInfo[] tis = new TaskInfo[10];
for (int i = 0; i < tis.Length; i++)
{
tis[i] = new TaskInfo(i.ToString());
}
for (int i = 0; i < tis.Length; i++)
{
//メソッドをスレッドプールのキューに追加する
//この時、状態オブジェクトも指定する
ThreadPool.QueueUserWorkItem(
new WaitCallback(PrintData), tis[i]);
}
//待機する
Console.ReadLine();
//結果を表示
for (int i = 0; i < tis.Length; i++)
{
Console.WriteLine(tis[i].Result);
}
Console.ReadLine();
}
//スレッドで実行するメソッド
private static void PrintData(object state)
{
//渡されたデータを取得
TaskInfo ti = (TaskInfo) state;
//取得したデータを表示
for (int i = 0; i < 1000; i++)
Console.Write("{0}{1}", ti.StringValue, i);
//結果を格納
ti.Result = ti.StringValue + ":END";
}
}
}}
ThreadPoolオブジェクトは一つのプロセスに一つだけ存在し、T...
スレッドプールはとても便利ですが、Threadクラスと違い、優...
なお、ThreadPoolクラスにはUnsafeQueueUserWorkItemというメ...
(注1:この数は変更できるとヘルプにあります。しかし、実際...
-[[The Code Project - Changing the default limit of 25 th...
-[[C# Corner - Changing the default limit of 25 threads o...
)
***ThreadPool.RegisterWaitForSingleObjectの使い方 [#a9e88...
続いては、ThreadPool.RegisterWaitForSingleObjectメソッド...
QueueUserWorkItemメソッドと比較した場合のRegisterWaitForS...
RegisterWaitForSingleObjectメソッドは、指定したWaitHandle...
次の例ではRegisterWaitForSingleObjectメソッドで10個のデリ...
#code(vbnet){{
'Imports System.Threading
'が宣言されているものとする
Class MainClass
'エントリポイント
Public Shared Sub Main()
'非シグナル状態でManualResetEventを作成
Dim ev As New ManualResetEvent(False)
Dim i As Integer
For i = 0 To 9
'デリゲートをキューに追加する
ThreadPool.RegisterWaitForSingleObject( _
ev, _
New WaitOrTimerCallback(AddressOf PrintTi...
Nothing, _
-1, _
True)
Next i
'待機する
Console.WriteLine("Enterキーを押してね")
Console.ReadLine()
'ManualResetEventをシグナル状態にする
ev.Set()
Console.ReadLine()
End Sub
'システム起動後の経過時間を表示
Private Shared Sub PrintTime(ByVal state As Object, _
ByVal timedOut As Boolean)
Console.WriteLine("システム起動後の経過時間:{0}ミ...
System.Environment.TickCount)
End Sub
End Class
}}
#code(csharp){{
//using System.Threading;
//が宣言されているものとする
class MainClass
{
//エントリポイント
public static void Main()
{
//非シグナル状態でManualResetEventを作成
ManualResetEvent ev = new ManualResetEvent(false);
for (int i = 0; i < 10; i++)
{
//デリゲートをキューに追加する
ThreadPool.RegisterWaitForSingleObject(
ev,
new WaitOrTimerCallback(PrintTime),
null,
-1,
true
);
}
//待機する
Console.WriteLine("Enterキーを押してね");
Console.ReadLine();
//ManualResetEventをシグナル状態にする
ev.Set();
Console.ReadLine();
}
//システム起動後の経過時間を表示
private static void PrintTime(object state, bool timedOut)
{
Console.WriteLine("システム起動後の経過時間:{0}ミリ秒",
System.Environment.TickCount);
}
}
}}
さらに、タイムアウトする時間を4番目の引数に指定してRegist...
また、RegisterWaitForSingleObjectメソッドの5番目の引数をf...
WaitOrTimerCallbackデリゲートの2番目の引数から、そのメソ...
次の例ではPrintTimeメソッドが1秒おきに実行されるようにし...
#code(vbnet){{
'Imports System.Threading
'が宣言されているものとする
Class MainClass
'エントリポイント
Public Shared Sub Main()
'非シグナル状態でAutoResetEventを作成
Dim ev As New AutoResetEvent(False)
'デリゲートをキューに追加する
'1秒おきに実行する
ThreadPool.RegisterWaitForSingleObject( _
ev, _
New WaitOrTimerCallback(AddressOf PrintTime), _
Nothing, _
1000, _
False)
Dim i As Integer
For i = 0 To 9
'3秒待機する
Thread.Sleep(3000)
'AutoResetEventをシグナル状態にする
ev.Set()
Next i
Console.ReadLine()
End Sub
'システム起動後の経過時間を表示
Private Shared Sub PrintTime(ByVal state As Object, _
ByVal timedOut As Boolean)
Console.WriteLine("システム起動後の経過時間:{0}ミ...
System.Environment.TickCount, timedOut)
End Sub
End Class
}}
#code(csharp){{
//using System.Threading;
//が宣言されているものとする
class MainClass
{
//エントリポイント
public static void Main()
{
//非シグナル状態でAutoResetEventを作成
AutoResetEvent ev = new AutoResetEvent(false);
//デリゲートをキューに追加する
//1秒おきに実行する
ThreadPool.RegisterWaitForSingleObject(
ev,
new WaitOrTimerCallback(PrintTime),
null,
1000,
false
);
for (int i = 0; i < 10; i++)
{
//3秒待機する
Thread.Sleep(3000);
//AutoResetEventをシグナル状態にする
ev.Set();
}
Console.ReadLine();
}
//システム起動後の経過時間を表示
private static void PrintTime(object state, bool timedOut)
{
Console.WriteLine("システム起動後の経過時間:{0}ミリ秒({...
System.Environment.TickCount,
timedOut);
}
}
}}
結果は例えば次のようになります。
#pre{{
システム起動後の経過時間:5140281ミリ秒(True)
システム起動後の経過時間:5141272ミリ秒(True)
システム起動後の経過時間:5142274ミリ秒(True)
システム起動後の経過時間:5142274ミリ秒(False)
システム起動後の経過時間:5143275ミリ秒(True)
システム起動後の経過時間:5144277ミリ秒(True)
システム起動後の経過時間:5145278ミリ秒(True)
システム起動後の経過時間:5145278ミリ秒(False)
システム起動後の経過時間:5146279ミリ秒(True)
システム起動後の経過時間:5147281ミリ秒(True)
...(以下省略)...
}}
WaitHandleがシグナル状態になるまで、またはタイムアウトす...
Unregisterメソッドと、さらに状態オブジェクトを使った例を...
Unregister(null);
により、それ以上は実行されなくなります。
#code(vbnet){{
'Imports System.Threading
'が宣言されているものとする
'状態オブジェクトのためのクラス
Class TaskInfo
'待機操作のためのRegisteredWaitHandle
Public Handle As RegisteredWaitHandle = Nothing
'メソッドに渡すデータ
Public StringValue As String
Public Sub New(ByVal str As String)
StringValue = str
End Sub
End Class
Class MainClass
'エントリポイント
Public Shared Sub Main()
'TaskInfoオブジェクトの作成
Dim ti As New TaskInfo("1")
'非シグナル状態でAutoResetEventを作成
Dim ev As New AutoResetEvent(False)
'デリゲートをキューに追加する
'状態オブジェクトを指定して、1秒おきに実行する
ti.Handle = ThreadPool.RegisterWaitForSingleObjec...
ev, _
New WaitOrTimerCallback(AddressOf PrintTime), _
ti, _
1000, _
False)
'待機
Console.ReadLine()
'AutoResetEventをシグナル状態にする
ev.Set()
Console.ReadLine()
End Sub
'システム起動後の経過時間を表示
Private Shared Sub PrintTime(ByVal state As Object, _
ByVal timedOut As Boolean)
'状態オブジェクトの取得
Dim ti As TaskInfo = CType(state, TaskInfo)
'表示
Console.WriteLine("システム起動後の経過時間:{0}ミ...
System.Environment.TickCount, timedOut)
'シグナルが送信されたら
'コールバックメソッドが実行されないように
'待機操作をキャンセルする
If Not timedOut And Not (ti.Handle Is Nothing) Then
ti.Handle.Unregister(Nothing)
End If
End Sub
End Class
}}
#code(csharp){{
//using System.Threading;
//が宣言されているものとする
//状態オブジェクトのためのクラス
class TaskInfo
{
//待機操作のためのRegisteredWaitHandle
public RegisteredWaitHandle Handle = null;
//メソッドに渡すデータ
public string StringValue;
public TaskInfo(string str)
{
StringValue = str;
}
}
class MainClass
{
//エントリポイント
public static void Main()
{
//TaskInfoオブジェクトの作成
TaskInfo ti = new TaskInfo("1");
//非シグナル状態でAutoResetEventを作成
AutoResetEvent ev = new AutoResetEvent(false);
//デリゲートをキューに追加する
//状態オブジェクトを指定して、1秒おきに実行する
ti.Handle = ThreadPool.RegisterWaitForSingleObject(
ev,
new WaitOrTimerCallback(PrintTime),
ti,
1000,
false
);
//待機
Console.ReadLine();
//AutoResetEventをシグナル状態にする
ev.Set();
Console.ReadLine();
}
//システム起動後の経過時間を表示
private static void PrintTime(object state, bool timedOut)
{
//状態オブジェクトの取得
TaskInfo ti = (TaskInfo) state;
//表示
Console.WriteLine("システム起動後の経過時間:{0}ミリ秒({...
System.Environment.TickCount,
timedOut);
//シグナルが送信されたら
//コールバックメソッドが実行されないように
//待機操作をキャンセルする
if (!timedOut && ti.Handle != null)
ti.Handle.Unregister(null);
}
}
}}
**コメント [#pd1dbf34]
#comment
//これより下は編集しないでください
#pageinfo([[:Category/.NET]],2003-12-15 (月) 06:00:00,DOB...
ページ名:
▲
▼
[
トップ
] [
新規
|
子ページ作成
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]