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

时间:2014-08-20 05:27:11

标签: c# winforms

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

我的问题是,当我运行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;

        }
    }

1 个答案:

答案 0 :(得分:2)

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

或者,最好,您应该将服务初始化和运行代码移至BackgroundWorker。这将确保您不需要任何Invoke

示例

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