Vladimir Potapov
Vladimir Potapov

Reputation: 2437

WinForm new form(waiting) is stuck when opens

I have wcf servise that Update db it is takes 10-15 sec,and i wont to run/show my form with loading/waitting statusbar while servise working, and when service is finished i need to close the watting form.

My problem is when i run ShowDialog(); it is get stuck on it , and don't go to my service. What i doing wrong here?

My code

My function

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

    }

My WaitForm code

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

        private void WaitForm_Load(object sender, EventArgs e)
        {
            radWaitingBar1.StartWaiting();
            radWaitingBar1.WaitingSpeed = 100;
            radWaitingBar1.WaitingStep = 5;

        }
    }

Upvotes: 0

Views: 893

Answers (1)

dotNET
dotNET

Reputation: 35380

ShowDialog() is a blocking call, i.e. the current thread will keep waiting on this line until the form is closed (by the user). You should show your WaitForm on a different thread than the main application thread, combined with Invoke() call to ensure that you don't do illegal cross-thread operations. You can use BackgroundWorker component to load and show your WaitForm on a different thread.

Alternately and preferably, you should move your service initialization and running code to the BackgroundWorker. That will ensure you don't need any Invokes.

Example

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

Upvotes: 2

Related Questions