c#マルチスレッドで関数をメソッドとして渡す(マルチシリアルポート同時、単一シリアルポート保証一発一収メカニズム)


一.まずマルチスレッドについて簡単に説明します。


1.パラメータなし、戻り値なし.
public void show()
{
    MessageBox.Show("ss");
}
 Thread thread = new Thread(new ThreadStart(show));
 thread.Start();

2.パラメータがあり、戻り値がありません.
public void SendGain(float gain)
{
    RS485Helper.SetGain(this, gain);
}

使用時:
 Thread thread = new Thread(new ParameterizedThreadStart(SendGain));
 thread.Start(3f);
 

なお、Threadは1つのパラメータしか持たず、複数のパラメータがthreadを使用したい場合はクラスにカプセル化するしかありません.3.複数のパラメータがあり、戻り値があります.
public object SendReadCmd(string id,string id2)
{
    RS485Helper.ReadParmeter(this, id,id2);
    return GetCallbackData() ;
}

使用時:
task = Task.Factory.StartNew<object>(() => SendReadCmd("ss","ss2"));
return task.Result;

二.関数をメソッドとして渡します。


1.パラメータなし戻り値なし
public void Execute(System.Action action)
{
    action.Invoke();
}
public void A()
{
    Console.WriteLine(" ");
}


次の操作を行います.
Execute(A);

2.パラメータ付き戻り値なし
public void Execute(System.Action<string,string> action,string data1,string data2)
{
    action.Invoke(data1, data2);
}
public void A(string data1,string data2)
{
    Console.WriteLine(data1+ data2);
}

次の操作を行います.
Execute(A,"","");

2.パラメータ付き戻り値
public void Execute(System.Func<string,string,bool> func,string data1,string data2)
{
   bool a= func(data1, data2);
}
public bool A(string data1,string data2)
{
    Console.WriteLine(data1+ data2);
    return true;
}

次の操作を行います.
Execute(A,"","");

三.マルチスレッドで関数をメソッドとして渡す

 public void ExecuteTask(Action<object> func, float info1)
 {
     Thread a = new Thread(new ParameterizedThreadStart(func));
     a.Start(info1);
 }
 public void SendGain(object gain)
 {
     lock (obj_lock)
     {
         RS485Helper.SetGain(this,(float)gain);
         MessageViewHelper.Write(" ");
     }
 }

次の操作を行います.
ExecuteTask(SendGain, 20f);

このような利点は、多くの方法がマルチスレッドを実行する必要がある場合、各方法にマルチスレッドを追加する必要がないことです.実際の応用では、例えば複数の半二重通信シリアル通信の場合、方法を1つのクラスにカプセル化し、ソフトウェアが起動したときにインスタンス化することができ、すべてのシリアルポートはマルチスレッドでコマンドを送信することができ、単一シリアルポートで複数のコマンドを送信する際にlockによってロックされ、1発1受信機制を保証する.