【问题标题】:TimerCallback not returning value C#TimerCallback 不返回值 C#
【发布时间】:2013-04-15 10:40:16
【问题描述】:

我正在使用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# 新手)。提前谢谢!

【问题讨论】:

  • 你对这段代码很迷茫。在任何情况下,您都无法使用 Timer 使其可靠。您在其他地方有一些设置 buff_out 的代码。让该代码也调用 SerialPort.WriteLine() + ReadLine()。

标签: c# multithreading timer callback return


【解决方案1】:

你误解了代表。

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

【讨论】:

  • 代理可以接受比object state更多的参数吗?因为send_port、recv_port、buff_out都是在main()函数中声明的,不在delegate函数的作用域内。
  • @dtemps123:不; Timer 不知道该通过什么。相反,直接在Main() 内声明匿名委托(并摆脱您的函数),它将能够通过闭包访问它们。或者,将它们设为类中的字段。
猜你喜欢
  • 1970-01-01
  • 2017-08-12
  • 2013-08-19
  • 2016-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-16
相关资源
最近更新 更多