我有一个表单需要通过 Web 服务调用将未保存的数据保存到外部数据库。当用户手动保存数据时,会触发 RunWorkerCompleted,但是当我通过 FormClosing 事件调用该方法时不会触发。
计时器在用户修改表单中的值几秒钟后滴答作响,如果用户修改另一个值,则计时器会被重置,其想法是“toSend”列表有多个值,我可以一次发布多个更改因为 Web 服务调用开销很大。
private void timer1_Tick(object sender, EventArgs e)
{
if (PublishBackgroundWorker.IsBusy)
return;
List<object> toSend = new List<object>();
// Figure out what changed and add it to toSend ...
toSend.Add(changedItems);
if (toSend.Count >= 1)
PublishBackgroundWorker.RunWorkerAsync(toSend);
}
private void PublishBackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
if (((List<object>)(e.Argument)).Count > 0)
{
Service.SrvObjects[] ret = Svc.PublishItems(e.Argument));
}
}
private void PublishBackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
Invoke(new UpdateStatusCallback(this.UpdateStatus), new object[] { "Ready" });
}
private void IPTUserInterfaceForm_FormClosing(object sender, FormClosingEventArgs e)
{
timer1.Enabled = false;
timer1_Tick(this, new EventArgs());
//Application.DoEvents();
while (PublishBackgroundWorker.IsBusy)
System.Threading.Thread.Sleep(100);
}
这有意义吗?当用户更改一个值并在计时器关闭之前关闭表单时,我手动 Tick 希望 PublishBackgroundWorker.IsBusy 在某个时候为假,并且永远不会因为 RunWorkerCompleted 从未被调用。