1

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# の新機能)。前もって感謝します!

4

1 に答える 1

5

あなたは代表者を誤解しています。

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);
};
于 2013-04-22T13:48:14.617 に答える