目次
1 Thread に関するメモ
2. Winform で使用されるスレッド
ホームページ バックエンド開発 C#.Net チュートリアル C# WinForm マルチスレッド開発 (1) Thread クラスライブラリ

C# WinForm マルチスレッド開発 (1) Thread クラスライブラリ

Feb 20, 2017 am 10:56 AM
c#

元のアドレス: クリックしてリンクを開きます

[概要]この記事では C# を紹介します WinForm マルチスレッド開発用の Thread クラス ライブラリ。参考用に簡単なサンプル コードを提供します。

Windows 2000 以降を使用している場合は、タスク マネージャーを通じてシステム上で現在実行されているプログラムとプロセスを表示できます。プロセスとは何ですか?プログラムが実行を開始すると、それはプロセスになります。プロセスとは、実行中のプログラムと、プログラムによって使用されるメモリおよびシステム リソースを指します。プロセスは複数のスレッドで構成されます。スレッドはプログラム内の実行フローです。各スレッドには独自のプライベート レジスタ (スタック ポインタ、プログラム カウンタなど) がありますが、コード領域は共有されます。つまり、異なるスレッドが実行できます。同じ機能です。マルチスレッドとは、プログラムに複数の実行ストリームが含まれていることを意味します。つまり、1 つのプログラム内で複数の異なるスレッドを同時に実行して、異なるタスクを実行できます。これは、1 つのプログラムで複数の並列実行スレッドを作成して、それぞれのタスクを完了できることを意味します。

1 Thread に関するメモ

.net Framework クラス ライブラリでは、マルチスレッド メカニズム アプリケーションに関連するすべてのクラスが System.Threading 名前空間に配置されます。これは、スレッドを作成するための Thread クラス、スレッド プールを管理するための ThreadPool クラスなどを提供します。さらに、スレッドの実行調整、デッドロック、スレッド間通信などの実際的な問題を解決するメカニズムも提供します。アプリケーションでマルチスレッドを使用する場合は、このクラスを含める必要があります。 Thread クラスには、次のようにいくつかの重要なメソッドがあります。

  • Start(): スレッドを開始します

  • Sleep(int): 静的メソッド、現在のスレッドを指定されたミリ秒間一時停止します

  • Abort(): このメソッドは通常、スレッドを終了するために使用されます

  • Suspend(): このメソッドは、未完了のスレッドを終了しません。スレッドを一時停止するだけで、後で再開できます。

  • Resume(): Suspend() メソッドによって一時停止されたスレッドの実行を再開します

C# では、スレッド エントリは、このスレッドに何をさせるかをプログラムに知らせます。 ThreadStart エージェント (デリゲート) の場合、ThreadStart は、スレッドによって実行される関数を指す関数ポインターとして理解できます。 Thread.Start() メソッドが呼び出されると、スレッドは、によって表される関数または指す関数の実行を開始します。スレッドの開始。 さまざまな状況での ThreadState の可能な値は次のとおりです:

  • Aborted: スレッドが停止しました

  • AbortRequested: スレッドの Thread.Abort() メソッドが呼び出されていますが、スレッドはまだ停止していません

  • Background: スレッドは、プロパティ Thread.IsBackground に関連してバックグラウンドで実行されます

  • Running: スレッドは正常に実行されています

  • Stopped: スレッドは停止されました

  • StopRequested: スレッドは停止するように要求されています

  • Suspended: スレッドは一時停止されています (この状態では、Resume() メソッドを呼び出すことで再実行できます)

  • SuspendRequested: スレッドは一時停止を要求していますが、時間内に応答しません

  • Unstarted: Thread.Start() はスレッドの実行を開始するために呼び出されませんでした

  • WaitSleepJoin: Wait( などのメソッドを呼び出したため、スレッドはブロック状態にあります) )、Sleep() または Join()


2. Winform で使用されるスレッド

まず最初に、最も直接的な方法を見てみましょう。これは、.net 1.0 でサポートされている方法でもあります。ただし、この方法は .net 2.0 以降ではすでに間違った方法であることに注意してください。


public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    private void Form1_Load(object sender, EventArgs e)
    {
        Thread thread = new Thread(ThreadFuntion);
        thread.IsBackground = true;
        thread.Start();
    }
    private void ThreadFuntion()
    {
        while (true)
        {
            this.textBox1.Text = DateTime.Now.ToString();
            Thread.Sleep(1000);
        }
    }
}
ログイン後にコピー

このコードは vs2005 または 2008 で例外をスローします: クロススレッド操作が無効です: コントロール 'textBox1' が作成されたスレッド以外のスレッドからアクセスされました これは、.net 2.0 以降のためです。では、セキュリティ メカニズムが強化され、WinForm のコントロールのプロパティへの直接クロススレッド アクセスが許可されなくなります。では、この問題を解決するにはどうすればよいでしょうか。いくつかの解決策があります。


最初の解決策: スレッドの作成時に Control.CheckForIllegalCrossThreadCalls を false に設定します。 このコードはコンパイラに次のように指示します。このクラスでは、クロススレッド呼び出しが正当であるかどうかをチェックしません (この文を追加せずに実行したときに例外がない場合、システムがデフォルトで非チェック方式を採用することを意味します)。ただし、このアプローチはお勧めできません。 CheckForIllegalCrossThreadCalls プロパティの定義を見ると、それが静的であることがわかります。つまり、プロジェクト内のどこでこの値を変更しても、グローバルに有効になります。そして通常、このようなクロススレッドアクセスに例外があるかどうかを確認します。プロジェクト内の他の誰かがこの属性を変更すると、私たちのソリューションは失敗し、別のソリューションを採用する必要があります。

2 番目のオプション

namespace TestInvoker
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            Thread thread = new Thread(new ThreadStart(StartSomeWorkFromUIThread));
            thread.IsBackground = true;
            thread.Start();
            //StartSomeWorkFromUIThread();
            //label1.Text = "Set value through another thread!";
        }
        private void StartSomeWorkFromUIThread()
        {
            if (this.InvokeRequired)
            {
                BeginInvoke(new EventHandler(RunsOnWorkerThread), null);
            }
            else
            {
                RunsOnWorkerThread(this, null);
            }
        }
        private void RunsOnWorkerThread(object sender, EventArgs e)
        {
            Thread.Sleep(2000);
            label1.Text = System.DateTime.Now.ToString();
        }
    }
}
ログイン後にコピー

上記のコードを通して、非同期を待機することで、常にメインスレッドの制御を保持するわけではないことがわかります。 winform マルチスレッド コントロールの -threaded コントロールは、クロススレッド呼び出し例外なしで完了します。

上記は、C# WinForm マルチスレッド開発 (1) Thread クラス ライブラリの内容です。その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) をご覧ください。


このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

C# を使用した Active Directory C# を使用した Active Directory Sep 03, 2024 pm 03:33 PM

C# を使用した Active Directory のガイド。ここでは、Active Directory の概要と、C# での動作方法について、構文と例とともに説明します。

C# の乱数ジェネレーター C# の乱数ジェネレーター Sep 03, 2024 pm 03:34 PM

C# の乱数ジェネレーターのガイド。ここでは、乱数ジェネレーターの仕組み、擬似乱数の概念、安全な数値について説明します。

C# データ グリッド ビュー C# データ グリッド ビュー Sep 03, 2024 pm 03:32 PM

C# データ グリッド ビューのガイド。ここでは、SQL データベースまたは Excel ファイルからデータ グリッド ビューをロードおよびエクスポートする方法の例について説明します。

C# の階乗 C# の階乗 Sep 03, 2024 pm 03:34 PM

C# の Factorial のガイド。ここでは、C# での階乗の概要について、さまざまな例とコード実装とともに説明します。

マルチスレッドと非同期C#の違い マルチスレッドと非同期C#の違い Apr 03, 2025 pm 02:57 PM

マルチスレッドと非同期の違いは、マルチスレッドが複数のスレッドを同時に実行し、現在のスレッドをブロックせずに非同期に操作を実行することです。マルチスレッドは計算集約型タスクに使用されますが、非同期はユーザーインタラクションに使用されます。マルチスレッドの利点は、コンピューティングのパフォーマンスを改善することですが、非同期の利点はUIスレッドをブロックしないことです。マルチスレッドまたは非同期を選択することは、タスクの性質に依存します。計算集約型タスクマルチスレッド、外部リソースと相互作用し、UIの応答性を非同期に使用する必要があるタスクを使用します。

C# のパターン C# のパターン Sep 03, 2024 pm 03:33 PM

C# のパターンのガイド。ここでは、C# のパターンの概要と上位 3 種類について、その例とコード実装とともに説明します。

C# の素数 C# の素数 Sep 03, 2024 pm 03:35 PM

C# の素数ガイド。ここでは、C# における素数の導入と例を、コードの実装とともに説明します。

XMLの形式を変更する方法 XMLの形式を変更する方法 Apr 03, 2025 am 08:42 AM

XML形式を変更する方法はいくつかあります。Atepadなどのテキストエディターを使用して手動で編集する。 XmlBeautifierなどのオンラインまたはデスクトップXMLフォーマットツールを使用して自動的にフォーマットします。 XSLTなどのXML変換ツールを使用して変換ルールを定義します。または、Pythonなどのプログラミング言語を使用して解析および操作します。元のファイルを変更してバックアップするときは注意してください。

See all articles