2

我有一个简单的 ChildWindow 只包含两个元素,文本块和进度条来模拟等待屏幕。该 ChildWindow 在调用异步 WCF 方法之前启动并在回调时关闭。

问题是 ChildWindow 第二次关闭整个表面保持禁用状态。我已经搜索过类似的情况,一篇博客文章谈到了 Close 方法被调用两次,这不是我的情况。

这是一些示例代码(svc 是 WCF 服务):

// global private class variable
private WaitingScreen wait = new WaitingScreen();

public void DoSomething()
{
  svc.SaveCompleted += (s, arg) =>
  {
    wait.Close();
  };

  wait.Show();
  svc.SaveAsync();
}

任何指针都将不胜感激,我想我在这里缺少一些基本的东西。

4

2 回答 2

1

Close 方法被调用了两次,这不是我的情况。

我想大概是这样。考虑已经调用DoSomething了两次,有多少委托被分配给了,SaveCompleted又有多少被删除了?答案:现在添加了 2 个,没有一个被删除。因此,当它第二次完成时,Close将快速连续调用两次。

试试这个代码,它会在委托被触发一次后删除它。

public void DoSomething()
{
  var wait = new WaitingScreen();

  EventHandler<AsyncCompletedEventArgs> saveCompleted = null;

  saveCompleted  = (s, arg) =>
  {
    wait.Close();
    svc.SaveCompleted -= saveCompleted;
  };

  svc.SaveCompleted += saveCompleted;
  wait.Show();
  svc.SaveAsync();
}

说了我同意@zapico 的所有内容后,请使用工具包 BusyIndi​​cator 来完成这项任务。

于 2011-06-09T22:04:40.720 回答
0

要在等待异步调用时显示一个窗口,我会使用silverlight toolkit中的“BusyIndi​​cator” 。

无论如何,如果 WaitingScreen 是 ChildWindow,它应该返回一个值(Accept 或 Cancel)来关闭。也许这就是问题所在。

于 2011-06-09T21:26:29.610 回答