我有一個簡單的應用程序使用async/await(.NET 4.0與異步定位包)與db溝通並返回結果。使表單元素等待,直到異步/等待完成
我需要改變一些表單元素的行爲,直到數據可用。對於簡單的實現,我想禁用表單元素,直到數據可用。或者更改表單元素上的點擊事件的行爲。
這樣做的正確方法是什麼?
我已經想到了
- 有一些布爾屬性讓元素知道線程運行。
- 使用事件形式來完成工作的按鈕? (我懷疑這是解決方案,但請詳細說明如何)
謝謝。
我有一個簡單的應用程序使用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;
}
}
對於簡單的禁用這是要走的路。我只是不知道,即使對於這樣簡單的事情,最好的做法是採用觀察者模式,就像安德斯提出的那樣...... – e4rthdog
那麼,設計模式解決方案的理由通常是他們的屬性是知道的。在這種情況下:觀察者可以很好地適應手頭的任務。如果你需要添加一個新的表單元素,那麼你需要添加任何東西,而不是在調度數據庫查找的代碼中。但是,當然,如果你只有兩個領域,繼續執行:)但你DID標記你的問題「設計模式」:D –
要走的路是用某種觀察者模式。這是最通用的解決方案。
所以:
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);
必須改變什麼行爲,又如何呢? –
@RoyDictus:提出了問題 – e4rthdog
@ L.B:我希望我的表單可以用於某些元素。 – e4rthdog