0

async / await (非同期ターゲット パッケージを使用した .NET 4.0) を使用してデータベースと通信し、結果を返す単純なアプリケーションがあります。

データが利用可能になるまで、いくつかのフォーム要素の動作を変更する必要があります。単純な実装では、データが利用可能になるまでフォーム要素を無効にしたいと思います。または、フォーム要素のクリック イベントの動作を変更します。

それを行う適切な方法は何ですか?

私は考えました

  • スレッドが動作していることを要素に知らせるためのブール値プロパティがあります。
  • 機能するボタンからイベンティングを使用しますか? (これが解決策だと思いますが、その方法を詳しく教えてください)

ありがとう。

4

2 に答える 2

1

これは、他の質問で見たコードと同じくらい単純なはずです。論理的にあなたが望む:

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;
    }
}
于 2012-12-03T07:23:27.260 に答える
1

行く方法は、ある種のオブザーバーパターンを使用することです。これは最も一般的なソリューションです。

そう:

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);
于 2012-12-03T07:48:18.103 に答える