C# スレッド、タスク、非同期、待機の違い

スレッドとタスクの違い

パラメータも戻り値も持たないスレッド: 実行効果は一貫しています

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

namespace SD_ZB_mqtt
{
    
    
    internal class Program
    {
    
    
        static void Main(string[] args)
        {
    
    
            Test();
            Console.ReadKey();
            
        }

        static void Test()
        {
    
    
            Thread task1 = new Thread(() =>
            {
    
    
                Thread.Sleep(1000*1);
                Console.WriteLine("1s");
            });
            Thread task2 = new Thread(() =>
            {
    
    
                Thread.Sleep(1000 * 2);
                Console.WriteLine("2s");
            });
            Thread task3 = new Thread(() =>
            {
    
    
                Thread.Sleep(1000 * 3);
                Console.WriteLine("3s");
            });
            Thread task4 = new Thread(() =>
            {
    
    
                Thread.Sleep(1000 * 4);
                Console.WriteLine("4s");
            });

            task4.Start();
            task3.Start();
            task2.Start();
            task1.Start();
            //打印1,2,3,4
        }

    }
}


internal class Program
    {
    
    
        static void Main(string[] args)
        {
    
    
            Test();
            Console.ReadKey();
            
        }

        static void Test()
        {
    
    
            Task task1 = new Task(() =>
            {
    
    
                Thread.Sleep(1000*1);
                Console.WriteLine("1s");
            });
            Task task2 = new Task(() =>
            {
    
    
                Thread.Sleep(1000 * 2);
                Console.WriteLine("2s");
            });
            Task task3 = new Task(() =>
            {
    
    
                Thread.Sleep(1000 * 3);
                Console.WriteLine("3s");
            });
            Task task4 = new Task(() =>
            {
    
    
                Thread.Sleep(1000 * 4);
                Console.WriteLine("4s");
            });

            task4.Start();
            task3.Start();
            task2.Start();
            task1.Start();
            //打印1,2,3,4
        }

引数なし構築の一貫した実行順序

パラメータあり / 戻り値あり:

知らせ, スレッドとタスクの両方でラムダ記述を使用してパラメータの受け渡しの問題を解決できます。

Thread thread1 = new Thread(()=>print("测试"));
Task thread1 = new Task(()=>print("测试"));

スレッドはパラメータを受け取ります。

オブジェクトを使用する必要があります。使用しない場合、エラーが報告されます。また、Thread にはパラメータ メソッドが 1 つしかないため、複数のパラメータを渡したい場合は、最初にクラスを宣言してクラスに渡すしかありません。

ここに画像の説明を挿入

internal class Program
 {
    
    
      static void Main(string[] args)
      {
    
    
          Test();
          Console.ReadKey();
          
      }

      public static void Test()
      {
    
    
          Thread thread1 = new Thread(new ParameterizedThreadStart(print));
          thread1.Start("a");
      }

      public static void print(object msg)
      {
    
    
          Thread.Sleep(1000);
          Console.WriteLine(msg);
      }

  }

スレッドには戻り値がありません

戻り値を追加すると、戻り値の型が間違っているというエラーが報告されます。他のブログで紹介されている方法は、委任を使用してブロックし、スレッドが完了するまで待つことです。
ここに画像の説明を挿入

パラメーターを伴うタスク: アクション委任を使用しますが、上記のラムダ式のおかげで、入力パラメーターの問題のほとんどは解決できるため、ここでは説明しません

おすすめ

転載: blog.csdn.net/qq_44695769/article/details/130719137