No se puede pasar parámetros adicionales para la devolución de llamada controlador de eventos, ya que no es la persona llamándola - el temporizador está; que es el punto ;-)
embargo, puede fácilmente lograr el mismo efecto con un cierre:
private void btnAutoSend_Click(object sender, EventArgs e)
{
timer.Elapsed += (timerSender, timerEvent) => send(timerSender, timerEvent, receiver);
timer.AutoReset = true;
timer.Enabled = true;
}
public void send(object source, System.Timers.ElapsedEventArgs e, string receiver)
{
this.rtbMsg.AppendText("psyche-->" + receiver + ": hello\n");
}
Ahora el controlador transcurrido es la acción (timerSender, timerEvent) =>
lambda, que se cierra sobre la receiver
variable y llama send
manualmente con el parámetro extra siempre que se active la lambda.
En su caso particular no necesitan que el remitente o argumentos en absoluto, así que no hay necesidad de reenviarlos. El código se convierte en:
private void btnAutoSend_Click(object sender, EventArgs e)
{
timer.Elapsed += (s_, e_) => OnTimerElapsed(receiver);
timer.AutoReset = true;
timer.Enabled = true;
}
private void OnTimerElapsed(string receiver)
{
this.rtbMsg.AppendText("psyche-->" + receiver + ": hello\n");
}
Si se está preguntando sobre la sobrecarga de todo esto, es bastante mínimo. Las lambdas son simplemente azúcar sintáctico y son funciones simples detrás de escena (con algunos envoltorios de delegados automáticos para las cosas del evento). Los cierres se implementan utilizando clases generadas por el compilador, pero no notará ningún tipo de hinchamiento de código a menos que realmente tenga un ton de ellos.
Como se indicó en los comentarios, parece que está accediendo a un elemento de IU en el código OnTimerElapsed
- ya que no está utilizando un temporizador de Windows Forms, hay una gran probabilidad de que obtenga una excepción al hacerlo desde el código se ejecutará en cualquier hilo del temporizador pasa a estar corriendo en cuando se activa el evento - y los controles de interfaz de usuario de Windows debe ser visitada solamente de la rosca que los creó.
Usted podría perder el tiempo con this.Invoke
para fijar de forma manual, pero es más fácil tener el temporizador Marshall el evento para el hilo adecuado para usted a través de la SynchronizingObject
property:
private void btnAutoSend_Click(object sender, EventArgs e)
{
timer.SynchronizingObject = this; // Assumes `this` implements ISynchronizeInvoke
timer.Elapsed += (s_, e_) => OnTimerElapsed(receiver);
timer.AutoReset = true;
timer.Enabled = true;
}
Por último, se le solicita por otro comentario, aquí hay otra forma en que podría almacenar una referencia al cierre de manera que puede darse de baja del acontecimiento posterior:
private void btnAutoSend_Click(object sender, EventArgs e)
{
timer.SynchronizingObject = this; // Assumes `this` implements ISynchronizeInvoke
ElapsedEventHandler onElapsed;
onElapsed = (s_, e_) => {
timer.Elapsed -= onElapsed; // Clean up after firing
OnTimerElapsed(receiver);
};
timer.Elapsed += onElapsed;
timer.AutoReset = true;
timer.Enabled = true;
}
Bueno, se puede utilizar el 'System.Windows.Forms.Timer' si se añade una referencia a la biblioteca. – annonymously
relacionado [cómo pasar el parámetro del remitente al system.timers.timer] (http://stackoverflow.com/questions/6368399/how-to-pass-the-the-sender-parameter-to-the-system -timers-timer) – Damith
No debe utilizar System.Windows.Timer con ningún componente UI (por ejemplo, rtbMsg.AppendText es probable que acceda a algún tipo de control de Windows), System.Timer.Elapsed se invoca en un subproceso no UI y causará una excepción en la mayoría de los casos. Si no es WinForms y es WPF, querrá usar un DispatchTimer. Si puede aclarar qué error está recibiendo, alguien podría ofrecerle un consejo más exacto. –