一.首先简单说明多线程。
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 只能带一个参数,如果是多个参数想用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);
这样的好处就是如果很多方法都需要多线程去执行,则无需每个方法都添加多线程。
在实际应用中,如多个半双工通信串口通信时,可以将方法封装到一个类里面,然后软件启动的时候实例化,所有串口可多线程发送命令,单串口发送多个命令时通过lock锁住,保证一发一收机制。