WinForm新表单(等待)打开时卡住

本文关键字:等待 表单 WinForm 新表单 | 更新日期: 2023-09-27 18:18:50

我有wcf服务,更新数据库需要10-15秒,我不想在服务工作时运行/显示加载/等待状态栏的表单,当服务完成时,我需要关闭等待表单。

我的问题是,当我运行ShowDialog();是卡住了,不去我的服务。我做错了什么?

我的代码

函数

 public static void UpdateSNXRATES(object sender, EventArgs e)
    {
        WaitForm waitF = new WaitForm();
        waitF.ShowDialog();//here it stuck
        using (var Server = new ServiceReference.Service1Client())
        {
            Server.ClientCredentials.Windows.ClientCredential.Domain = strDomain;
            Server.ClientCredentials.Windows.ClientCredential.UserName = strUser;
            Server.ClientCredentials.Windows.ClientCredential.Password = strPassword;
            success=Server.UpdateSNXRATES();
        }

        waitF.Close();
    }

我的WaitForm代码

 public partial class WaitForm : Form
    {
        public WaitForm()
        {
            InitializeComponent();
        }
        private void WaitForm_Load(object sender, EventArgs e)
        {
            radWaitingBar1.StartWaiting();
            radWaitingBar1.WaitingSpeed = 100;
            radWaitingBar1.WaitingStep = 5;
        }
    }

WinForm新表单(等待)打开时卡住

ShowDialog()是一个阻塞调用,即当前线程将一直在这一行等待,直到表单被(用户)关闭。您应该在与主应用程序线程不同的线程上显示WaitForm,并结合Invoke()调用来确保您不会执行非法的跨线程操作。你可以使用BackgroundWorker组件在不同的线程上加载和显示WaitForm

另外,最好将服务初始化和运行代码移到BackgroundWorker中。这将确保您不需要任何Invoke s。

ServiceReference.Service1Client Server;
WaitForm waitF;
public static void UpdateSNXRATES(object sender, EventArgs e)
{
    BackgroundWorker bw = new BackgroundWorker();
    bw.WorkerReportsProgress = true;
    bw.DoWork += bw_DoWork;
    bw.RunWorkerCompleted += bw_RunWorkerCompleted;
    bw.RunWorkerAsync();
    waitF = new WaitForm();
    waitF.ShowDialog();
}
static void bw_DoWork(object sender, DoWorkEventArgs e)
{
    Server = new ServiceReference.Service1Client();
    Server.ClientCredentials.Windows.ClientCredential.Domain = strDomain;
    Server.ClientCredentials.Windows.ClientCredential.UserName = strUser;
    Server.ClientCredentials.Windows.ClientCredential.Password = strPassword;
    success = Server.UpdateSNXRATES();
}
static void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    waitF.Close()
}