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