2

У меня есть окно, отображающее сервис, с помощью метода CloseWindow, который вызывается видом. Я хочу создать метод блокировки в моем кодовом коде. Поэтому я могу блокировать, пока появляется окно, и чтобы выходы возвращались из окна.Использование дескриптора ожидания события для блокировки окна закрывается, а затем завершается как ожидание async. Приемлемо?

Возможно ли использование ручного сброса? Существуют ли какие-либо технические или дизайнерские проблемы с ним или с тем, как я смешиваю его с TPL?

Вот что сервис

private readonly ManualResetEvent closedEvent = new ManualResetEvent(true); 

public void DisplayWindow(){ 
    window = new MyWindow(); 
} 

public void CloseWindow() { 
    window.Close(); 
    closedEvent.Set(); 
} 

//new 
public async Task WaitClosed() 
    { 
     await Task.Run(() => this.closedEvent.WaitOne()); 
    } 

вот код, который вызывает его.

public void DisplayWindow(string content, string title) 
    { 
     dialogservice.DisplayWindow(); 
    } 

    public async Task DisplayWindowAsync(string content, string title) 
    { 
     dialogservice.DisplayWindow(); 
     await dialogservice.WaitClosed(); 
    } 
+0

Почему не 'ShowDialog'? – Amorphis

ответ

2

Похоже, что это можно было бы сделать более просто и без зависания резьбы:

private readonly TaskCompletionSource<bool> windowClosed 
    = new TaskCompletionSource<bool>(); 

public Task WindowClosed { get { return windowClosed.Task; } } 


public void CloseWindow() { 
    window.Close(); 
    windowClosed.TrySetResult(true); 
} 

с:

await dialogservice.WindowClosed; 
+0

Спасибо. Чтобы быть в безопасности, я установил его в конструкторе, и я делаю его ложным в DisplayWindow(). И это происходит с тем, чтобы передать мой TResult назад, отлично. –

+2

@NathanCooper no; do ** NOT ** установить true в конструкторе; 'true' /' false' здесь ничего не значит; если вы установили результат, ** вы говорите, что оно завершено **. Вы этого не хотите. Вы хотите, чтобы он был неполным. –