2013-04-22 72 views
0

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

初始化:

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#)。谢谢你在前进!

+0

你完全迷失了方向,此代码。没有任何情况下你可以通过定时器使其可靠。你在其他地方设置了一些代码来设置* buff_out *。有代码也调用SerialPort.WriteLine()+ ReadLine()。 – 2013-04-22 13:51:05

回答

3

你误会代表。

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

委托人可以采用比'对象状态'更多的参数吗?因为send_port,recv_port和buff_out都在main()函数中声明并且不在委托函数的范围内。 – dtemps123 2013-04-22 13:51:34

+0

@ dtemps123:不; '定时器'不知道该怎么传递它。相反,直接在'Main()'内部声明匿名委托(并去掉你的函数),它将能够通过闭包访问它们。或者,让他们成为课堂上的领域。 – SLaks 2013-04-22 13:52:56