2014-01-19 3 views
1

저는 주로 Windows Phone에서 작업 중이며 MessageBox와 비슷한 것을 만들려고합니다 - apperas라는 작은 창 (사용자가 선택한 창을 기다리는 스레드가 대기)을 기다립니다. 내 작업은 다음과 같습니다이 경우 TaskCompletionSource
-

FIRST :MessageBox를 모방하여 사용자의 선택을 기다립니다.

TaskCompletionSource<bool> taskComplete = new TaskCompletionSource<bool>(); 
private async Task myTask1() 
{ 
    window.Show(); // Show window 
    await taskComplete.Task; 
    //some job run after User's choice 
    MessageBox.Show("Job finished"); 
} 

그리고 내 방 창문의 휴일 이벤트 :

private void WindowClosedEvent1(object sender, EventArgs e) 
{ 
    taskComplete.SetResult(true); 
} 

나는 3 개 나는이 목표를 achive 수있는 방법을 방법을 발견 SECOND - SemaphoreSlim
내 작업 및 이벤트 :

(210)
private SemaphoreSlim mySemaphore = new SemaphoreSlim(0, 1); 
private async Task myTask2() 
{ 
    window.Show(); // Show window 
    await mySemaphore.WaitAsync(); 
    //some job run after User's choice 
    MessageBox.Show("Job finished"); 
} 

private void WindowClosedEvent2(object sender, EventArgs e) 
{ 
    mySemaphore.Release(); 
} 

THIRD - EventWaitHandle :
내 작업 및 이벤트 :

EventWaitHandle waitForUser = new EventWaitHandle(false, EventResetMode.AutoReset, "myEventName"); 
private async Task myTask3() 
{ 
    window.Show(); // Show window 
    await Task.Run(() => waitForUser.WaitOne()); 
    //some job run after User's choice 
    MessageBox.Show("Job finished"); 
} 

private void WindowClosedEvent3(object sender, EventArgs e) 
{ 
    waitForUser.Set(); 
} 

세 가지 방법이 작동,하지만 난 사용할 결정할 수 없습니다. 나는 대부분 1) 또는 2)가 최선의 선택이 될 것이라고 생각하고 있습니다. 이 세 가지 방법 중 어떤 방법으로 어떤 상황에서 문제가 생길 수 있습니까? 아무도 이런 걸 시도 했니?

+0

왜 동기화해야합니까? 다음과 같은 것을 찾고 있습니까? http://stackoverflow.com/q/20917996/1768303? – Noseratio

+0

@Noseratio 지금 Windows Phone으로 작업 중이며, 내가 아는 한 ShowDialog가 없습니다. 그래서 위의 코드를 시도하고 있습니다. 그것은 작동하지만 비동기 프로그래밍에 익숙하지 않은 나는 의심의 여지가 있고 내가 알지 못하는 많은 것들이있을 수있다. – Romasz

+0

WinPhone 개발에 익숙하지 않지만 대부분의 GUI 프레임 워크에서 백그라운드 스레드의 GUI 기능을 호출하는 것은 아니오입니다 (모든 GUI 항목은 하나의 스레드에 있어야합니다). WinPhone이 그런 식으로 작동하지 않는 한 조심해야 할 것입니다.이 경우 무시하십시오! – TypeIA

답변

1

변종 # 1은 TaskCompletionSource으로 충분합니다. 그게 TaskCompletionSource입니다. # 2와 # 3은 불필요한 복잡성이 있으며 특히 # 3은 Task.Run(..)이며 차단 대기를 위해 풀 스레드를 낭비합니다.

WP에서 Popup의 형식이 없으므로이 세 가지 방법 모두 잠재적으로 한 가지 중요한 문제 인 재진입이 있습니다. 예를 들어, 버튼 클릭시 myTask2()이 호출되면 사용자가 해당 버튼을 다시 클릭 할 수 없으므로 다시 myTask2()이 시작됩니다. 앱의 UI 워크 플로에서이를 고려해야합니다. 이에 대해서는 here에 설명되어 있습니다.

+1

이 문제에 대해 생각하고 좀 더 시도해 보았습니다. TaskCompletionSource가이 작업에 가장 적합하다는 것을 인정합니다.이 작업의 다른 이점은 결과를 전달할 수 있다는 것입니다.그리고 모든 접근 방식에서 UI가 반드시 고려되어야한다는 것이 맞습니다. – Romasz