Estoy trabajando en una aplicación WPF y me encuentro con problemas de congelación, ahora he aprendido que es una aplicación de un solo subproceso, pero me confundo con las terminologías.
Yo términos simples
Quiero explicar mi punto de vista para que quede claro en ambos extremos mi malentendido, hasta ahora he aprendido que la mayoría de las aplicaciones son STA (en C #), y tienes que usar programación asíncrona, lo que muy bien puede implicar
Creo que, en su mayor parte, mi concepto es al menos sólido, por decir lo menos, donde me falta aplicar estas habilidades.
por ejemplo, pensé que anteriormente para habilitar la programación asíncrona teníamos que usar delegados para ser llamados desde el método principal, lo que evolucionó a un despachador de delegados que evolucionó aún más a asíncrono y a la espera de cortar 'CUALQUIER USO ÚNICO DE' despachador (incluso ese literal palabra clave)
así que todo lo que usé fue la palabra "asincrónica" en la declaración de la función, seguida de la "tarea", luego esperé un proceso intenso al agregar una palabra "esperar" antes de que finalmente encapsulara ese trabajo intenso con Task.Run (() = > Trabajo Intenso())
pero ahora estoy confundido de que tiene que usar la palabra Dispatcher porque solo el dispatcher puede acceder a los elementos de la interfaz de usuario y usar Dispatcher.Invoke (IntenseWork()), luego está Dispatcher.Begininvoke y Dispatcher.AsyncIncoke
en cuyo caso, async/await y task.run no serán suficientes y la biblioteca paralela de tareas incluso se usará aquí
Hice preguntas e investigué y estoy atascado en estas conclusiones, estas son mis preguntas anteriores
Usando async y await para lograr la asincronía en el problema de ejemplo
Estás preguntando sobre dos tecnologías diferentes de diferentes períodos.
El problema común es que la interfaz de usuario tiene un solo subproceso y solo se debe acceder desde el subproceso principal (UI).
Puede y debe descargar el trabajo que no es de interfaz de usuario a otro subproceso tanto como sea posible. Pero por lo general hay resultados que deben mostrarse después.
El enfoque antiguo (pero aún válido) es entregar un delegado a Dispatcher.Invoke() o Control.Invoke() en WinForms.
El enfoque más nuevo, aplicable a Task.Run() y todos los métodos de E/S de DoSomethingAsync() es usar await:
// use async void only for eventhandlers async void LoadButton_Click(object s, RouteEventArgs e) { // get input from controls here var results = await Task.Run(() => HeavyWorkWithoutUI()); // update UI with results here }El soporte de WPPF y WinForms es que sus métodos de nivel superior se ejecutarán en el subproceso de la interfaz de usuario antes y después de una espera. El método pesado se ejecutará en otro subproceso. Durante la espera, su interfaz de usuario permanece receptiva.
Entonces, await es un poco más conveniente, ya que le permite escribir un código más legible con menos esfuerzo.