.NETのストリーム。 パート1

このトピックでは、.NETプラットフォームでのスレッドの使用に関する初期情報を提供します。 これはHabréに関する私の最初の投稿なので、あまり厳しく判断しないでください。 また、素材を改善する方法について建設的な批判を聞きたいです。



スレッドは、プログラム内の命令の独立したシーケンスです。 スレッドを作成する最も簡単な方法は、デリゲートを非同期的に呼び出すことです。

static int TestThread( int data, int ms)

{

Console .WriteLine( "TestThread started" );

Thread.Sleep(ms);

Console .WriteLine( "TestThread completed" );

return ++data;

}



public delegate int TestThreadDelegate( int data, int ms);




* This source code was highlighted with Source Code Highlighter .






デリゲートが作業を完了したかどうかを確認する方法はいくつかありますが、これはBeginInvoke()メソッドを使用して行うことができます。 このメソッドは、IsCompletedプロパティを持つIAsyncResult型を返します。 結果を待つ2番目の方法は、待機記述子を使用することです。 AsyncWaitHandleプロパティを使用してアクセスできます。 3番目の方法は、非同期コールバックを使用することです。

static void Main()

{



TestThreadDelegate d1 = TestThread;



d1.BeginInvoke(1, 3000, TestThreadCompleted, d1);

for ( int i = 0; i < 100; i++)

{

Console .Write( "." );

Thread.Sleep(50);

}



}



static void TestThreadCompleted(IAsyncResult ar)

{

if (ar == null ) throw new ArgumentNullException( "ar" );

TestThreadDelegate d1 = ar.AsyncState as TestThreadDelegate;

Trace.Assert(d1 != null , "Invalid object type" );



int result = d1.EndInvoke(ar);

Console .WriteLine( "result: {0}" , result);

}




* This source code was highlighted with Source Code Highlighter .






スレッドを作成する別の方法は、Threadクラスを使用することです。 また、それらを管理することもできます。

using System;

using System.Threading;



namespace Csharp.Threading.FirstThread

{

class Program

{

static void Main( string [] args)

{

Thread t1 = new Thread(ThreadMain);

t1.Start();

Console .WriteLine( "This is the main thread." );

}

static void ThreadMain()

{

Console .WriteLine( "In thread." );

}

}

}




* This source code was highlighted with Source Code Highlighter .






データをスレッドに転送するには、2つの方法があります。ParameterizedThreadStartデリゲートでThreadコンストラクターを使用する方法、または特別なクラスを作成してスレッドメソッドをインスタンスメソッドとして定義する方法です。

public class MyThread

{

private string data;



public MyThread( string data)

{

this .data = data;

}



public void ThreadMain()

{

Console .WriteLine( "Running in a thread, data: {0}" , data);

}

}




* This source code was highlighted with Source Code Highlighter .






メイン:

MyThread obj = new myThread(“text”);



Thread tr = new Thread(obj.ThreadMain);



tr.Start();



* This source code was highlighted with Source Code Highlighter .






ストリームには、優先度とバックグラウンドの2種類があります。 プロセスは、少なくとも1つの優先スレッドが実行されるまで実行を続けます。 Threadクラスを使用すると、デフォルトで作成されます。 ストリームをバックグラウンドにするには、IsBackgroundプロパティを使用する必要があります。



オペレーティングシステムは、スレッドの実行順序を計画します。 このプロセスは、Priorityプロパティを使用してスレッドに適切な優先度を割り当てることで影響を受けます。



事前に一連のスレッドを作成し、必要に応じてこのセットを増減する必要がある場合があります。 このために、ThreadPoolクラスが提供されています。

using System;

using System.Threading;



namespace Csharp.Threading.Pools

{



class Program

{

static void Main()

{



for ( int i = 0; i < 5; i++)

{

ThreadPool.QueueUserWorkItem(JobForAThread);



}



Thread.Sleep(5000);

}



static void JobForAThread( object state)

{

for ( int i = 0; i < 3; i++)

{

Console .WriteLine( "loop {0}, running inside pooled thread {1}" , i,

Thread.CurrentThread.ManagedThreadId);

Thread.Sleep(10);

}



}

}

}




* This source code was highlighted with Source Code Highlighter .






ただし、スレッドプールにはいくつかの制限があります。それらはバックグラウンドであり、プール内の優先順位またはスレッド名を変更することはできません。



それがすべてです。 次回は、デッドロックとスレッドの同期について説明します。



UPD。 .NETに移動しました。 カルマをありがとう。




All Articles