1

我正在使用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);

回调函数:

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);
}

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

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

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

4

1 回答 1

5

你误解了代表。

TimerCallback委托类型——一种可以保存函数的类型。
TimerCallback只能持有带有签名的函数

void MethodName(Object state)

当你写

public static TimerCallback Timer_func(...) { ... }

您刚刚声明了一个返回委托TimerCallback的函数。
因此,您的函数必须返回与 TimerCallback 匹配的函数。

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

return delegate (object state) {
    string buff_in;
    send_port.WriteLine(buff_out);
    buff_in = recv_port.ReadLine();
    Console.WriteLine(buff_in);
};
于 2013-04-22T13:48:14.617 回答