如何在表单加载事件期间显示等待的Gif图像

时间:2017-11-04 08:44:47

标签: c# multithreading winforms async-await thread-synchronization

我有一个表单在表单加载事件上做了一些很长的过程, 所以我想在表单加载事件期间显示One Gif图像“Please Wait”。

下面是代码。

private void frmWaitShow()
        {
            try
            {
                frmWaitwithstatus objWait = new frmWaitwithstatus();// this form has Gif Image for Processing
                objWait.lblStatus.Text = "Processing Request, Please wait...";
                objWait.ShowDialog();
            }
            catch (Exception ex)
            {
                Logger.SystemException(ex);
                Logger.FTSError(" ERROR :" + ex.Message + "frmTest || frmWaitShow");

            }
        }


        Thread oThread;
        private void frmTest_Load(object sender, EventArgs e)
        {
            try
            {


                oThread = new Thread(new ThreadStart(frmWaitShow));
                oThread.Start();

                //Functions for Connection with devices
                if (LoadDatafromDB() == false) return;
                if (ElectTestLoad() == false) return;
                if (PowerOnSelfTest() == false) { return; }
                InitiControlsElectTest();
                SetSystemMode(SystemMode.ElectricalMode);

                oThread.Abort();
            }
            catch (Exception ex)
            {
                oThread.Abort();
                Logger.SystemException(ex);

            }
        }

在Thread.start()之后,我的调试器在每个主线程中执行一步,我创建了一个但是在它转到下面的行之后。

frmWaitwithstatus.cs构造函数第一行

public frmWaitwithstatus()

它停止执行我的线程并在主线程执行完成后执行主线程的所有功能,然后才开始执行我的线程(这是Gif处理图像)。

1 个答案:

答案 0 :(得分:2)

使用 async / await 模式将使这变得简单,每个表单都可以在UI线程上运行:

driver :poltergeist, phantomjs_options: ["--ignore-ssl-errors=true"]
delay 10..20

控件的异步扩展名:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private async void Form1_Load(object sender, EventArgs e)
    {
        // async show loading form dialog
        var loadingForm = new LoadingForm();
        var loadingDialogTask = this.InvokeAsync(loadingForm.ShowDialog);

        // async loading data
        var data = await LoadDataAsync();
        listBox1.DataSource = data;

        loadingForm.Close();
        await loadingDialogTask;
    }

    private async Task<ICollection<string>> LoadDataAsync()
    {
        // fake work load
        await Task.Delay(4000).ConfigureAwait(false);
        return Enumerable.Range(1,20000).Select(e => e.ToString()).ToList();
    }

}