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 只能带一个参数,如果是多个参数想用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锁住,保证一发一收机制。

你可能感兴趣的:(c#,#,c#,非控件常用操作,多线程,函数,函数作为方法传递,多串口,串口通信)