Tengo un poco de código que necesito ejecutar en un hilo diferente al de la GUI, ya que actualmente hace que el formulario se congele mientras se ejecuta el código (aproximadamente 10 segundos).
Suponga que nunca he creado un nuevo hilo antes; ¿Cuál es un ejemplo simple / básico de cómo hacer esto en C # y usar .NET Framework 2.0 o posterior?
c#
.net
multithreading
p.campbell
fuente
fuente
Respuestas:
Un buen lugar para comenzar a leer es Joe Albahari .
Si desea crear su propio hilo, esto es lo más simple posible:
fuente
IsBackground
en verdadero. Probablemente no hace lo que crees que hace. Lo que hace es configurar si el subproceso se eliminará cuando todos los subprocesos en primer plano hayan muerto o si el subproceso mantendrá viva la aplicación. Si no desea que su hilo termine a mitad de la ejecución, no lo configureIsBackground
en verdadero.BackgroundWorker
Parece ser la mejor opción para ti.Aquí está mi ejemplo mínimo. Después de hacer clic en el botón, el trabajador en segundo plano comenzará a trabajar en el subproceso en segundo plano y también informará de su progreso simultáneamente. También informará después de que se complete el trabajo.
Nota:
ProgressChanged
o losRunWorkerCompleted
controladores. Sin embargo, la actualización de la GUIDoWork
causaráInvalidOperationException
.fuente
El ThreadPool.QueueUserWorkItem es bastante ideal para algo sencillo. La única advertencia es acceder a un control desde el otro hilo.
fuente
Rápido y sucio, pero funcionará:
Usando en la parte superior:
código simple:
Acabo de lanzar esto en una nueva aplicación de consola para un ejemplo
fuente
Aquí hay otra opción:
fuente
Intenta usar la clase BackgroundWorker . Le da delegados para saber qué ejecutar y recibir una notificación cuando haya terminado el trabajo. Hay un ejemplo en la página de MSDN que he vinculado.
fuente
Si quieres obtener un valor:
fuente
Ponga ese código en una función (el código que no se puede ejecutar en el mismo hilo que la GUI), y para activar la ejecución de ese código coloque lo siguiente.
Thread myThread= new Thread(nameOfFunction);
workerThread.Start();
Llamar a la función de inicio en el objeto de subproceso provocará la ejecución de su llamada de función en un nuevo subproceso.
fuente
nameOfFunction
en segundo plano, y no en el hilo GUI actual. LaIsBackground
propiedad determina si el hilo mantendrá viva la aplicación o no: msdn.microsoft.com/en-us/library/…Aquí, cómo puede usar hilos con una barra de progreso, es solo para entender cómo funcionan los hilos, en la forma que hay tres botones de barra de progreso y 4:
fuente
Charles su código (arriba) no es correcto. No necesita girar, esperar a que se complete. EndInvoke se bloqueará hasta que se señale WaitHandle.
Si desea bloquear hasta su finalización, simplemente necesita
o alternativamente
Pero, ¿cuál es el punto de emitir llamadas anyc si bloquea? También podría usar una llamada síncrona. Una mejor apuesta sería no bloquear y pasar una lambda para la limpieza:
Una cosa a tener en cuenta es que debe llamar a EndInvoke. Mucha gente olvida esto y termina filtrando WaitHandle, ya que la mayoría de las implementaciones asíncronas lanzan waithandle en EndInvoke.
fuente
Si va a utilizar el objeto Thread sin procesar, debe establecer IsBackground en true como mínimo y también debe establecer el modelo de Threading Apartment (probablemente STA).
Recomendaría la clase BackgroundWorker si necesita interacción con la interfaz de usuario.
fuente
Otra opción, que utiliza delegados y el conjunto de subprocesos ...
suponiendo que 'GetEnergyUsage' es un método que toma un DateTime y otro DateTime como argumentos de entrada, y devuelve un Int ...
fuente
int usageCnt = nrgDel.Invoke(lastRunTime, procDT, null, null);
? Parece que suspende el hilo actual con el sueño de todos modos ... Pensé que no ayudaría nada con el congelamiento de la GUI si lo llamas en el hilo de la GUIHay muchas formas de ejecutar hilos separados en .Net, cada una tiene comportamientos diferentes. ¿Necesita continuar ejecutando el hilo después de que se cierre la GUI? ¿Necesita pasar información entre el hilo y la GUI? ¿El hilo necesita actualizar la GUI? ¿Debería el hilo hacer una tarea y luego cerrar, o debería continuar ejecutándose? Las respuestas a estas preguntas le dirán qué método usar.
Hay un buen artículo sobre el método asíncrono sobre el en el sitio web de Code Project que describe los diversos métodos y proporciona un código de muestra.
Tenga en cuenta que este artículo fue escrito antes de que el patrón asíncrono / espera y la Biblioteca de tareas paralelas se introdujeran en .NET.
fuente
Cómo: utilizar un hilo de fondo para buscar archivos
Debe tener mucho cuidado con el acceso desde otros hilos a cosas específicas de la GUI (es común para muchos kits de herramientas de la GUI). Si desea actualizar algo en la GUI desde el subproceso de procesamiento, marque esta respuesta que creo que es útil para WinForms. Para WPF, vea esto (muestra cómo tocar el componente en el método UpdateProgress () para que funcione desde otros hilos, pero en realidad no me gusta que no lo esté haciendo
CheckAccess()
antes de hacerlo aBeginInvoke
través de Dispathcer, vea y busque CheckAccess en él)Estaba buscando un libro específico de .NET sobre subprocesos y encontré este (descargable gratis). Consulte http://www.albahari.com/threading/ para obtener más detalles al respecto.
Creo que encontrará lo que necesita para iniciar la ejecución como nuevo subproceso en las primeras 20 páginas y tiene muchas más (no estoy seguro acerca de los fragmentos específicos de la GUI, quiero decir estrictamente específicos para subprocesos). Me alegraría saber qué piensa la comunidad sobre este trabajo porque estoy leyendo este. Por ahora parecía bastante ordenado para mí (para mostrar métodos y tipos específicos de .NET para subprocesos). También cubre .NET 2.0 (y no el antiguo 1.1) lo que realmente aprecio.
fuente
Recomiendo mirar la Biblioteca de subprocesos de poder de Jeff Richter y específicamente el IAsyncEnumerator. Eche un vistazo al video en el blog de Charlie Calvert donde Richter lo repasa para obtener una buena visión general.
No se desanime por el nombre porque hace que las tareas de programación asíncrona sean más fáciles de codificar.
fuente