【问题标题】:How to show waiting Gif image during form load event如何在表单加载事件期间显示等待的 Gif 图像
【发布时间】:2017-11-04 18:08:36
【问题描述】:

我有一个表单正在对表单加载事件进行一些长时间的处理, 所以我想在表单加载事件期间显示一个 Gif 图片“请稍候”。

下面是代码。

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 处理图像)。

【问题讨论】:

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


【解决方案1】:

使用 async/await 模式可以轻松完成任务,并且每个表单都可以在 UI 线程上运行:

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();
    }

}

控件需要异步扩展:

public static class ControlAsyncExtensions
{
    public static Task InvokeAsync(this Control control, Action action)
    {
        var tcs = new TaskCompletionSource<bool>();
        control.BeginInvoke(new Action(() =>
        {
            try
            {
                action();
                tcs.SetResult(true);
            }
            catch (Exception ex)
            {
                tcs.SetException(ex);
            }
        }
        ));
        return tcs.Task;
    }

    public static Task<T> InvokeAsync<T>(this Control control, Func<T> action)
    {
        var tcs = new TaskCompletionSource<T>();
        control.BeginInvoke(new Action(() =>
        {
            try
            {
                tcs.SetResult(action());
            }
            catch (Exception ex)
            {
                tcs.SetException(ex);
            }
        }
        ));
        return tcs.Task;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-26
    • 2013-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-26
    相关资源
    最近更新 更多