2010-06-24 8 views
5

Pregunta alternativa: ¿Por qué VS10 está tan interesado en quejarse de Invoke?¿Qué conjunto de C# contiene Invocar?

En mi continua búsqueda de hacer mi trabajo de aplicación convertirse en los mejores del mundo programador de C#, he decidido que las discusiones son una buena cosa ™.

MSDN tiene un artículo útil sobre cómo hacer thread-safe calls to controls, pero (y aparentemente cualquier otro artículo sobre el tema) hace referencia oblicua a un método llamado Invoke. A veces incluso BeginInvoke, que I've read is to be preferred.

Todo esto sería genial, si pudiera conseguir que Visual Studio reconozca a Invoke. MSDN dice que it is contained in the System.Windows.Forms assembly, pero ya estoy 'usando' eso. Para estar seguro, también he intentado usar System.Threading, pero fue en vano.

¿Qué aros necesito saltar para que invoque el funcionamiento?

+0

¿Qué quiere decir con "Visual Studio Recognize Invoke"? Intellisense? –

+0

¿Está hablando de invocar un método en un control que se creó en un subproceso diferente al del subproceso que se está ejecutando actualmente? –

+1

+1 por humor ... –

Respuesta

4

Invoke está dentro de Control. Es decir. Control.Invoke();

No hay forma de llamar directamente a Invoke ya que no existe dicho método en System.Windows.Forms. El método Invoke es un miembro de control.

He aquí un example que hice anteriormente:

public delegate void AddListViewItemCallBack(ListView control, ListViewItem item); 
public static void AddListViewItem(ListView control, ListViewItem item) 
{ 
    if (control.InvokeRequired) 
    { 
     AddListViewItemCallBack d = new AddListViewItemCallBack(AddListViewItem); 
     control.Invoke(d, new object[] { control, item }); 
    } 
    else 
    { 
     control.Items.Add(item); 
    } 
} 
2

es necesario llamar a Invoke en una ejemplo de algo que lo contiene - si está usando Windows Forms, eso sería un control:

control.Invoke(someDelegate); 

o para el código dentro de un formulario, puede utilizar el this implícita referencia:

Invoke(someDelegate); 

Usted no debería tener que pasar por ningún aros particulares. Si Visual Studio se queja, especifique el error del compilador y el código del que se queja. No hay nada especial acerca de Invoke aquí.

2

El winform Invoke es un método de instancia de Control - solo necesita una instancia de control (que puede ser this en muchos casos). Por ejemplo:

txtBox.Invoke(...); 

También se puede acceder a través de una interfaz, o la sincronización de contexto si quieres abstracción - pero el método más sencillo es para manejar la situación en la interfaz de usuario a través de un evento, en el que caso de los controles están convenientemente disponibles .

0

Invoke es un método sobre objetos, generalmente se encuentra en los controles en la biblioteca de formularios y algunas clases asíncronas. Por supuesto, necesita objetos específicos para poder llamar a Invoke en que control/clase.

1

Si realmente quiere llegar a ser los mejores del mundo programador de C# que tiene que aprender que los hilos no son una buena cosa si no se utiliza correctamente.

La actualización de la IU entre subprocesos suele ser un signo de que está abusando de los subprocesos.

De todos modos, no es suficiente usar using System.Windows.Forms, debe agregarlo a las referencias. Hacer un clic derecho sobre References en su explorador de proyectos, a continuación, agregar referencias y seleccione System.Windows.Forms

+0

¡Gracias! Fuiste y terminaste me confundiste. (Aquí hay otra pregunta que le gustaría responder: http://stackoverflow.com/questions/3110154/why-is-the-explicit-management-of-threads-a-bad-thing) –

+0

"La actualización de la interfaz de usuario a través de subprocesos es generalmente una señal de que estás abusando de los hilos ". Wow, eso es nuevo para mí. Entonces, si pongo una operación larga de análisis en un hilo BG para mantener la UI receptiva, pero el usuario desea ver los resultados incrementales rápidamente, entonces mi hilo BG publica periódicamente los resultados al hilo de UI, ¿esto es abuso? ¿Y ahora vas a revelar la mejor solución? –

+2

Sí, es bastante simple: usar eventos. El subproceso BG proporciona un evento al que la UI puede suscribirse, es decir, "FileCopied", "NumberCalculated", etc. La interfaz de usuario puede suscribirse y el trabajador de fondo seguirá trabajando sin modificaciones si cambia el código de winforms a WPF, implemente UI multilingüe, cambie un diálogo aburrido a un diálogo elegante, etc. – dbemerlin

0

Estás presumiblemente tratando de llamar a Invoke desde dentro de una clase (es decir, no desde dentro de un Form o una Control). Mueva su código fuera de la clase a un formulario o control, y verá que Invoke compila y funciona correctamente (estrictamente hablando, su código debe hacer referencia a this.Invoke, lo que aclara el origen del método, pero Invoke también funcionará desde asume el this).

Cuestiones relacionadas