TimerCallback没有返回值C#

dte*_*123 1 c# multithreading return timer callback

System.Threading.Timer用来创建一个计时器,将一个字符串打印到一个串口,然后每秒从另一个串口读取.我试图通过向我的TimerCallback函数发送参数来做到这一点.下面是我的代码,其中初始化计时器和回调函数的代码.

初始化:

TimerCallback tcb = Timer_func(buff_out, send_port, recv_port);
AutoResetEvent autoEvent = new AutoResetEvent(false);
Timer aTimer = new Timer(tcb,autoEvent,1000,1000);
Run Code Online (Sandbox Code Playgroud)

回调函数:

public static TimerCallback Timer_func(string buff_out, SerialPort send_port, SerialPort recv_port)
{
    string buff_in;
    send_port.WriteLine(buff_out);
    buff_in = recv_port.ReadLine();
    Console.WriteLine(buff_in);
}
Run Code Online (Sandbox Code Playgroud)

初始化发生在Main()函数中,两个函数都在同一个类中.

当我按原样编译代码时,我收到错误CS0161:"并非所有代码路径都返回一个值".为了解决这个问题我已经添加return 1;到该函数的末尾,但后来我收到错误CS0029:"无法显式地将类型'int'转换为'System.Threading.Timer'.

我做错了什么,我该如何解决它.(C#新手)先感谢您!

SLa*_*aks 5

你是对代表的误解.

TimerCallback委托类型 - 可以保存函数的类型.
TimerCallback只能保存带签名的功能

void MethodName(Object state)
Run Code Online (Sandbox Code Playgroud)

当你写作

public static TimerCallback Timer_func(...) { ... }
Run Code Online (Sandbox Code Playgroud)

你刚才宣布的函数返回一个TimerCallback代表.
因此,您的函数必须返回与TimerCallback匹配的函数.

你可以使用匿名委托来做到这一点:

return delegate (object state) {
    string buff_in;
    send_port.WriteLine(buff_out);
    buff_in = recv_port.ReadLine();
    Console.WriteLine(buff_in);
};
Run Code Online (Sandbox Code Playgroud)