2015-06-11 27 views
2

我正在與合作伙伴一起開展xamarin項目。 Xamarin允許在iOS或Android編碼中使用C#。下面是一些代碼同事寫道,我覺得基本上更好的辦法可以做一個例子:如何正確「等待」聽衆?替換hacky旋轉鎖解決方案

alert = new AlertDialog.Builder (Act); 
alert.SetOnDismissListener(new OnDismissListener(() => { 
    blocked = false; 
})); 

alert.SetNegativeButton (noOption, (senderAlert, args) => { 
    affirmative = false; 
    alert.Dispose(); 
}); 

alert.SetPositiveButton (yesOption, (senderAlert, args) => { 
    affirmative = true; 
    alert.Dispose(); 
}); 
    //display the alert 
    //call GetAffirmative() 
... 
... 
... 
private async Task<bool> GetAffirmative() 
{ 
    int secondsToDelay = 1; 
    await Task.Delay(TimeSpan.FromSeconds(secondsToDelay)); 
    if (!blocked) { 
     return affirmative; 
    } 
    return await GetAffirmative(); 
} 

本質上,它創建一個作用於兩個布爾警告:肯定的布爾值被設置是/否響應,並且阻塞的布爾值用於旋轉鎖定。當自旋鎖由於'阻塞'布爾值被設置爲false而解析時,它從await中返回。

我真的不喜歡這個解決方案。什麼是更好的選擇? (最好是一個新的範例,而不是簡單地從遞歸變爲循環等)

+0

'return await GetAffirmative();'這是遞歸的!最好使用'while(true)'循環。 – usr

回答

4

使用TaskCompletionSource。這就是您創建異步任務並在需要時完成它的方式。

創建它時,就會調用GetAffirmative發,等待其Task財產,並完成它,而不是設置的falseblocked

alert.SetOnDismissListener(new OnDismissListener(() => { 
    _tcs.SetResult(false); 
})); 

... 

TaskCompletionSource<bool> _tcs; 
private async Task<bool> GetAffirmative() 
{ 
    _tcs = new TaskCompletionSource<bool>(); 
    await _tcs.Task; 
    return affirmative; 
} 

沒有一個非通用TaskCompletionSource所以我使用一個bool之一,任何其他類型也會工作。