2012-12-03 491 views
0

我有一個簡單的應用程序使用async/await(.NET 4.0與異步定位包)與db溝通並返回結果。使表單元素等待,直到異步/等待完成

我需要改變一些表單元素的行爲,直到數據可用。對於簡單的實現,我想禁用表單元素,直到數據可用。或者更改表單元素上的點擊事件的行爲。

這樣做的正確方法是什麼?

我已經想到了

  • 有一些布爾屬性讓元素知道線程運行。
  • 使用事件形式來完成工作的按鈕? (我懷疑這是解決方案,但請詳細說明如何)

謝謝。

+0

必須改變什麼行爲,又如何呢? –

+0

@RoyDictus:提出了問題 – e4rthdog

+0

@ L.B:我希望我的表單可以用於某些元素。 – e4rthdog

回答

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; 
    } 
} 
+0

對於簡單的禁用這是要走的路。我只是不知道,即使對於這樣簡單的事情,最好的做法是採用觀察者模式,就像安德斯提出的那樣...... – e4rthdog

+0

那麼,設計模式解決方案的理由通常是他們的屬性是知道的。在這種情況下:觀察者可以很好地適應手頭的任務。如果你需要添加一個新的表單元素,那麼你需要添加任何東西,而不是在調度數據庫查找的代碼中。但是,當然,如果你只有兩個領域,繼續執行:)但你DID標記你的問題「設計模式」:D –

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);