C# 等待表格发出Winform

C# 等待表格发出Winform,c#,.net,winforms,C#,.net,Winforms,我已经运行了一些代码行有一段时间了,如果您能帮助我,我将非常感激。我试图创建一个“等待”表单,每当我执行任何需要较长时间处理的方法时,它都会显示出来。我创建了IDisposable“Espera”类,如下所示: public class Espera : IDisposable { FrmEspera fEspera; public Espera(string texto = "Espere...") { Task.Run(

我已经运行了一些代码行有一段时间了,如果您能帮助我,我将非常感激。我试图创建一个“等待”表单,每当我执行任何需要较长时间处理的方法时,它都会显示出来。我创建了IDisposable“Espera”类,如下所示:

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元素。你还需要知道什么?