Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# TimerCallback未返回值C_C#_Multithreading_Timer_Callback_Return - Fatal编程技术网

C# TimerCallback未返回值C

C# TimerCallback未返回值C,c#,multithreading,timer,callback,return,C#,Multithreading,Timer,Callback,Return,我正在使用System.Threading.Timer创建一个计时器,它将字符串打印到串行端口,然后每秒从另一个串行端口读取。我试图通过向TimerCallback函数发送参数来实现这一点。下面是我初始化计时器的代码和回调函数的代码 初始化: TimerCallback tcb = Timer_func(buff_out, send_port, recv_port); AutoResetEvent autoEvent = new AutoResetEvent(false); Timer aTim

我正在使用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);
}
初始化发生在主函数中,两个函数都在同一个类中

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


我做错了什么,我怎样才能纠正它。新到C。提前谢谢你

你误解了代表们

是委托类型–可以容纳函数的类型。 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);
};

你误解了代表们

是委托类型–可以容纳函数的类型。 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);
};

你完全不懂这段代码。在任何情况下,您都无法使用计时器使其可靠。你在别的地方有一些代码可以让buff_出局。让该代码也调用SerialPort.WriteLine+ReadLine。你对这段代码完全迷茫了。在任何情况下,您都无法使用计时器使其可靠。你在别的地方有一些代码可以让buff_出局。让该代码也调用SerialPort.WriteLine+ReadLine。委托可以接受比对象状态更多的参数吗?因为send_port、recv_port和buff_out都在main函数中声明,不在委托函数的范围内。@dtemps123:否;计时器不知道该传递什么。相反,直接在Main中声明匿名委托,并去掉函数,它将能够通过闭包访问它们。或者,使它们成为类中的字段。委托可以接受比对象状态更多的参数吗?因为send_port、recv_port和buff_out都在main函数中声明,不在委托函数的范围内。@dtemps123:否;计时器不知道该传递什么。相反,直接在Main中声明匿名委托,并去掉函数,它将能够通过闭包访问它们。或者,在类中创建字段。