繁体   English   中英

使表单元素等到async / await结束

[英]Make form elements wait until async / await finishes

我有一个简单的应用程序,使用async / await(带有异步目标包的.NET 4.0)与db通信并返回结果。

我需要改变一些表单元素的行为,直到数据可用。 对于简单的实现,我想在数据可用之前禁用表单元素。 或者更改表单元素上的单击事件的行为。

这样做的正确方法是什么?

我想到了

  • 有一些布尔属性让元素知道线程正在运行。
  • 使用事件来完成工作的按钮? (我怀疑这是解决方案,但请详细说明如何)

谢谢。

这应该与我们在您的其他问题中看到的代码一样简单。 逻辑上你想要:

foo.Enabled = false;
bar.Enabled = false;
// etc
await Task.Run(...);
foo.Enabled = true;
bar.Enabled = true;

现在,如果将所有需要此处理的控件放在一起,您可以更轻松地做到这一点:

SetEnabled(controlCollection, false);
await Task.Run(...);
SetEnabled(controlCollection, true);

...

private static void SetEnabled(IEnumerable<Control> controls, bool enabled)
{
    foreach (var control in controls)
    {
        control.Enabled = enabled;
    }
}

要走的路是某种观察者模式。 这是最通用的解决方案。

所以:

public interface ObserveDataAvailable {
  public void dataIsAvailable(final Data data);
}

public class ObserveDataAvailableComposite {
  private final List<ObserveDataAvailable> items = new LinkedList<ObserveDataAvailable>();

  public add(final ObserveDataAvailable item) {
    items.add(item);
  }

  public add(final List<ObserveDataAvailable> items) {
    this.items.addAll(items);
  }


  public void dataIsAvailable(final Data data) {
    for (final ObserveDataAvailable item : items) {
      item.dataIsAvailable(item);
    }
  }
}

public class ActivateFormelementWhenDataAvailable {
  private final FormElement fe;

  public ActivateFormelementWhenDataAvailable(final FormElement fe) {
    this.fe = fe;
  }

  public void dataIsAvailable(final Data data) {
    fe.set(data);
    fe.activate();
  }
}


// Run in thread
private void doDataLookup(final ObserveDataAvailable onCompletion) {
  final Data data = getDataFromDb();
  onCOmpletion.dataIsAvailable(data);
}

现在你可以这样做:

final ObserveDataAvailable onCompletion = new ObserveDataAvailable();
<add the form elements>
runInThread(doDataLookup(onCompletion);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM