我正在撰寫軟體的后端部分,有時我需要我的用戶選擇一些東西,這可能是一個復雜的程序,用戶甚至可以隨時取消選擇。
從后端我想做類似的事情:
private async void StartAction()
{
//some code
var SelectedItem = await UI.RequestUserToChooseItem();
// some final code using the selected item
}
在這里,我不知道如何處理取消,但我可以發送 null 并假設如果SelectedItem為 null,則它已被取消。
但是它的 UI 部分呢?當用戶選擇事物時,如何處理它以回傳呼叫?
我需要在這里執行一些步驟:(這是偽代碼,我什至不知道從哪里開始)
public List<Item> RequestUserToChooseItem()
{
PrepareItemsInList();
ShowSelectionPanel();
List<Items> SelectedItemsFromPanel = WaitForUserToChose(); //???????
return SelectedItemsFromPanel;
}
然后我們有取消按鈕:
private void CancelButtonClicked(object sender, EventArgs e)
{
CancelWaitedSelectionProcessAndReturnNull(); //????
}
uj5u.com熱心網友回復:
您可以使用TaskCompletionSource來發出選擇信號。就像是
private TaskCompletionSource<MyOptions> tcs;
public Task<MyOptions> ShowPanelAndWaitForSelection(){
// show panel and do other initialization
tcs = new TaskCompletionSource<MyOptions>();
return tcs.Task;
}
public void OnOptionSelection(MyOptions value) => tcs.SetResult(value);
public void OnCanceled() => tcs.SetCanceled();
如果任務被取消,任何等待者都會得到一個OperationCanceledException,所以你的代碼通常看起來像:
try{
...
var selectedOption = await ShowPanelAndWaitForSelection();
...
}
catch(OperationCanceledException){
// Handle cancellation
}
catch(Exception e){
// Handle actual errors
}
這假設您的 UI 是非模態的,例如以相同的形式顯示和隱藏面板。如果您為每個步驟使用模式對話框,則不需要任何異步代碼。
這種風格本質上是使用編譯器來生成狀態機,而不是手動撰寫這樣的狀態機。我認為這對于處理特定情況可能是一種有用的風格,因為您可以使用 if/while 等常規結構來制作決策樹。但它可能并不總是凈積極的,它可能會絆倒那些不期望它的開發人員.
uj5u.com熱心網友回復:
這是一個異步方法,它異步等待第一次單擊一個或多個按鈕,并回傳單擊的按鈕:
public static Task<Button> OnClickAsync(params Button[] buttons)
{
var tcs = new TaskCompletionSource<Button>();
foreach (var button in buttons) button.Click = OnClick;
return tcs.Task;
void OnClick(object sender, RoutedEventArgs e)
{
foreach (var button in buttons) button.Click -= OnClick;
tcs.SetResult((Button)sender);
}
}
它可以這樣使用:
public async Task<List<Item>> RequestUserToChooseItemAsync()
{
PrepareItemsInList();
ShowSelectionPanel();
var selectedButton = await OnClickAsync(btnOK, btnCancel);
if (selectedButton == btnCancel) return null;
return SelectedItemsFromPanel;
}
此方法應僅在 UI 執行緒上呼叫,而不是在后臺執行緒上呼叫,因為它與 UI 元素互動。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/439433.html
上一篇:在formikreact中的onChange事件上沒有呼叫方法
下一篇:禁用Unity除錯畫布
