저는 주로 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
내 작업 및 이벤트 :
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)가 최선의 선택이 될 것이라고 생각하고 있습니다. 이 세 가지 방법 중 어떤 방법으로 어떤 상황에서 문제가 생길 수 있습니까? 아무도 이런 걸 시도 했니?
왜 동기화해야합니까? 다음과 같은 것을 찾고 있습니까? http://stackoverflow.com/q/20917996/1768303? – Noseratio
@Noseratio 지금 Windows Phone으로 작업 중이며, 내가 아는 한 ShowDialog가 없습니다. 그래서 위의 코드를 시도하고 있습니다. 그것은 작동하지만 비동기 프로그래밍에 익숙하지 않은 나는 의심의 여지가 있고 내가 알지 못하는 많은 것들이있을 수있다. – Romasz
WinPhone 개발에 익숙하지 않지만 대부분의 GUI 프레임 워크에서 백그라운드 스레드의 GUI 기능을 호출하는 것은 아니오입니다 (모든 GUI 항목은 하나의 스레드에 있어야합니다). WinPhone이 그런 식으로 작동하지 않는 한 조심해야 할 것입니다.이 경우 무시하십시오! – TypeIA