我正在使用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#的新手)。先感谢您!
最佳答案
您误会了代表们。
TimerCallback
是委托(delegate)类型–一种可以容纳函数的类型。TimerCallback
仅可保存带有签名的函数
void MethodName(Object state)
当你写
public static TimerCallback Timer_func(...) { ... }
您刚刚声明了一个返回
TimerCallback
委托(delegate)的函数。因此,您的函数必须返回与TimerCallback匹配的函数。
您可以使用匿名委托(delegate)来做到这一点:
return delegate (object state) {
string buff_in;
send_port.WriteLine(buff_out);
buff_in = recv_port.ReadLine();
Console.WriteLine(buff_in);
};