c#マルチスレッドで関数をメソッドとして渡す(マルチシリアルポート同時、単一シリアルポート保証一発一収メカニズム)
13799 ワード
一.まずマルチスレッドについて簡単に説明します。
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受信機制を保証する.