C# 等待表格发出Winform
我已经运行了一些代码行有一段时间了,如果您能帮助我,我将非常感激。我试图创建一个“等待”表单,每当我执行任何需要较长时间处理的方法时,它都会显示出来。我创建了IDisposable“Espera”类,如下所示:C# 等待表格发出Winform,c#,.net,winforms,C#,.net,Winforms,我已经运行了一些代码行有一段时间了,如果您能帮助我,我将非常感激。我试图创建一个“等待”表单,每当我执行任何需要较长时间处理的方法时,它都会显示出来。我创建了IDisposable“Espera”类,如下所示: public class Espera : IDisposable { FrmEspera fEspera; public Espera(string texto = "Espere...") { Task.Run(
public class Espera : IDisposable
{
FrmEspera fEspera;
public Espera(string texto = "Espere...")
{
Task.Run(async () => await mostrarFormulario(texto));
}
private async Task mostrarFormulario(string texto)
{
await Task.Run(() =>
{
fEspera = new FrmEspera();
fEspera.Texto = texto;
fEspera.ShowDialog();
});
}
public void Dispose()
{
try
{
Application.DoEvents();
fEspera?.InvokeIfRequired(() => fEspera.Dispose());
GC.SuppressFinalize(this);
}
catch (AggregateException ae)
{
Log.Instance.Error($"Error AgregateException Espera => {ae.Message}");
}
catch (Exception ex)
{
Log.Instance.Error($"Exception Espera => {ex.Message}");
}
}
}
问题是,有时候,当我调用表单时,消息框会出现在它下面,甚至当我单击“接受”时,表单也会继续运行,而不是像没有执行dispose订单一样关闭。我错过了什么
using (new Espera("Aplicando reglas al perfil..."))
{
await miMetodo();
}
MessageBox.Show(“OK”);
最后,我修复了在构造函数中创建表单的问题
public Espera(string texto = "Espere...")
{
fEspera = new FrmEspera();
Task.Run(async () => await MostrarFormulario(texto));
}
并在任务中返回对话框结果
public async Task<DialogResult> MostrarFormulario(string texto = "Espere...")
{
return await Task.Run(() =>
{
fEspera.Texto = texto;
return fEspera.ShowDialog();
});
}
谢谢每当您从不同的线程创建和显示表单时,您都会遇到奇怪和意外的行为。别那么做。从与UI界面相同的线程创建和显示等待表单…问题是我在UI界面中执行此操作,并且它可以工作,但是当调用发生以填充UI线程中的数据网格时,gif动画的等待表单将冻结,直到操作完成。有没有办法让gif在UI线程中继续工作?可能您只需要接近?此链接可以提供一个完美的解决方案:。如果这有效,别忘了投票请永远不要打电话给Application.DoEvents。它仅在与VB6应用程序升级向后兼容的框架中。它是邪恶的,因为它中断了应用程序消息泵。它最终会导致您无法轻松调试的bug。请不要这样做。不要从非UI线程创建、访问或更新任何UI元素。这绝对包括Task.Run中的任何代码。您可以将必须执行的任何处理推送到非UI线程,但您必须始终确保不创建、访问或更新任何UI元素。如果您能告诉我应该如何操作,我将非常乐意听从您的建议。谢谢。您知道如何执行任务。运行。只是不要在Task.Run中创建、访问或更新任何UI元素。你还需要知道什么?