2016-03-20 26 views
1

Benzer bir şey bulmak için çalıştı ve verilen tüm cevapları okuyun ama bana açıklayacak bir şey bulamadı.async beklemeyi beklemiyor

İletişim kutusu açılır penceresini (WPF) açmak için örnek bir kod. ShowOverlayView'ın True değerine döndükten sonra, UI'nin erişilebilir olacağı (bu yüzden beklenmedik olmasının nedeni budur) ve programın "Kapat" ı tıklandığında bitene kadar beklemesini istiyorum.

Küçük açıklama: ShowOverlayViewModel, bir ContentControl öğesinin Görünürlük özelliği için true/false değerine bir boolean ayarlar. Bu durumda, o zaman “normal yol” için beklemek için hiçbir şeyim yok.

Şu an görünüm "görünür" olduğunda MessageBox hemen gösterilir. AutoResetEvent için beklemiyor gibi görünüyor.

Küçük güncelleme: MessageBox ile ilgili olması gerektiği anlaşılıyor. Kod özelliğini bekledikten sonra Message özelliğini değiştirmeyi denedim ve yalnızca .set() 'den sonra oluştu. MessageBox neden yaptığı gibi davranmayı hala öğrenmeyi çok isterim. yardım

+0

#usr - Bunun nasıl yapılacağı konusunda daha iyi bir fikir isterim. Teşekkürler –

cevap

4

Klasik async-boşluk hata için

private void CommandAction() 
    { 
     ShowOptionsDialog(); 
     MessageBox.Show(""); 
    } 

    private async void ShowOptionsDialog() 
    { 
     var are = new AutoResetEvent(false); 

     var viewmodel = new DialogPopupViewModel(); 
     viewmodel.Intialize("some title", "some message", DialogPopupViewModel.YesNoCancelButtons); 
     SetOverlayViewModel(viewmodel); 

     viewmodel.SetCloseViewAction(() => 
      { 
       HideOverlayView(); 
       are.Set(); 
      }); 
     ShowOverlayView = true; 

     await Task.Factory.StartNew(() => 
      { 
       are.WaitOne(); 
       //return viewmodel.DialogResult; 
      }); 
     //return DialogResultEnum.Cancel; 

    } 

teşekkürler. Async void ne yapar ve neden bu kötü bir uygulama. ShowOptionsDialog(), beklenen yürütme hemen devam eden bir görevi döndürmediğinden. Dönüş türünü Task olarak değiştirin ve yöntem çağrısının sonucunu bekleyin.

Olayı TaskCompletionSource<object> ile değiştirip await myTcs.Task deyin. Bir TCS daha TPL uyumlu bir olaydır.

+0

Teşekkürler. Dönüş tipi Görev yardımcı oldu. TaskCompletionSource hakkında okurum –

İlgili konular