2013-04-22 90 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