我有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;
}
}
答案 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()
}