2014-10-28 5 views
0

열거 형을 반환하는 공용 함수가 하나 뿐인 라이브러리를 만들려고합니다. 내 요구 사항에 따라이 기능을 수행하는 개인 기능은 Android 플랫폼으로 인해 비동기 적이어야합니다. 내가하고 싶은 것은, 유일한 비공개 함수를 비동기 함수로서 소비하는 것입니다. 이것이 반 직관적이라고 생각할지 모르지만, 나는 이유가 있습니다. 함수 소비자는 이전에 동기 코드로 항상 코드를 실행해야 했으므로보다 효율적인 라이브러리로 래핑되었으므로이 요구 사항은 변경되지 않습니다. 나는 그들이 방법을 기다리고있는 것을 원하지 않는다. 그들은 알 필요가 없으며, 그것은 그 뒤에서 일어나는 일입니다. 여기 숨겨진 비동기 함수

내가 지금까지 무엇을 가지고,하지만 난 대중 방법을 고민하고 있습니다 :

요약
public enum DialogResult 
{ 
    Button1 = 1, 
    Button2 = 2, 
    Button3 = 3, 
} 

class MsgBox 
{ 
    public DialogResult Show(String Title, String Caption, Context context) 
    { 


    } 

    private async Task<DialogResult> ShowAsync(String Title, String Caption, Context context) 
    { 
     return await BuildAsync(Title, Caption, context); 
    } 

    private Task<DialogResult> BuildAsync(String Title, String Caption,Context context) 
    { 
     var r = new TaskCompletionSource<DialogResult>(); 

     new AlertDialog.Builder(context) 
     .SetPositiveButton("Yes", (sender, args) => 
     { 
      // User pressed yes 
      r.SetResult(DialogResult.Button1); 
     }) 
     .SetNegativeButton("No", (sender, args) => 
     { 
      // Do nothing 
      r.SetResult(DialogResult.Button2); 
     }) 

     .SetMessage(Caption) 
     .SetTitle(Title) 
     .Show(); 

     return r.Task; 

    } 

} 

; 이 공용 함수가 ShowAsync에서 반환 된 후 DialogResult를 반환하기 만하면되며, 기다리지 않고 호출 할 필요가 없습니다.

+0

'ShowAsync (...)와 유사합니다. 결과'? – DavidG

+1

DavidG에게 감사 드려요.하지만이 방법을 사용해 보았는데 UI가 교착 상태에 빠졌습니다. – user3280560

+0

'ConfigureAwait'는 어떻습니까? – DavidG

답변

1

가장 빠르고 가장 좋은 대답은 "할 수 없다"입니다. 당신이하려는 일에 대해 생각해보십시오 : 코드가 완료되기 전에 메시지 루프에 대한 실행을 UI 스레드의에 반환해야하지만 코드를 호출하는 코드는 UI 스레드를 차단해야합니다. 코드가 완료 될 때까지 논리적으로 불가능한 디자인입니다.

그러나 실제로 작동 시키려고 시도 할 수있는 a couple hacks이 있습니다. 하나의 옵션은 작업을 다른 스레드로 오프로드하는 것입니다. 그러나 사용중인 API가 UI 스레드에서 실행되어야하기 때문에 귀하의 경우에는 작동하지 않습니다. 나머지 해킹은 중첩 된 메시지 루프를 실행하는 것입니다.

중첩 된 메시지 루프를 실행할 때 심각한 문제가 하나 있습니다. 재진입 성. 본질적으로 중첩 된 메시지 루프가 생기면 고객의 전체 애플리케이션이 재진입 성을 처리해야합니다. 이것이 "DoEvents이 사악한 이유"입니다. 이것은 단지 고객을 끌어 들이기위한 거대한 요구 사항이며, 단지 방법을 만드는 것보다 설명하고 지원하기가 훨씬 더 복잡합니다. async.

+0

자세한 답변을 보내 주셔서 솔루션 해킹을 시도하십시오. 동의 해킹은 가장 잘 피할 수 있습니다. 내 앞에 많은 사람들처럼 패배를 받아 들여야 할 것 같아. – user3280560