2013-12-15 27 views
37

. Ho un'app di Windows Store C#. Sto provando a lanciare un MessageDialog quando si fa clic su uno dei pulsanti di comando all'interno di un altro MessageDialog. Il punto è di avvertire l'utente che il loro contenuto non è salvato, e se fa clic su Annulla, chiederà loro di salvare usando una finestra di dialogo di salvataggio separata.L'operatore 'await' può essere utilizzato solo all'interno di un'espressione lambda asincrona

Ecco la mia funzione "showCloseDialog":

private async Task showCloseDialog() 
{ 
    if (b_editedSinceSave) 
    { 
     var messageDialog = new MessageDialog("Unsaved work detected. Close anyway?", "Confirmation Message"); 

     messageDialog.Commands.Add(new UICommand("Yes", (command) => 
     { 
      // close document 
      editor.Document.SetText(TextSetOptions.None, ""); 
     })); 

     messageDialog.Commands.Add(new UICommand("No", (command) => 
     { 
      // save document 
      await showSaveDialog(); 
     })); 

     messageDialog.DefaultCommandIndex = 1; 
     await messageDialog.ShowAsync(); 
    } 
} 

In VS ottengo un errore di compilazione:

The 'await' operator can only be used within an async lambda expression. Consider marking this lambda expression with the 'async' modifier`

Il metodo è contrassegnato con await. Se rimuovo await da prima showSaveDialog, compila (e funziona), ma ottengo un avvertimento che mi dovrebbe usare await

Come utilizzare await in questo contesto?

+3

Il delegato lambda non è contrassegnato come asincrone '(comando) =>' – Silvermind

+1

Come nota a margine, se ho un programma che chiede me "Rilevato lavoro non salvato. Chiudi comunque?" e fai clic su "No", mi aspetto che l'operazione venga annullata. Non mi aspetto che il programma salvi il file o ti offra di salvare il file. Per il comportamento che stai cercando, la domanda "Rilevato lavoro non salvato. Salva prima di chiudere?" potrebbe essere più appropriato. – hvd

+0

@hvd questo è solo un testo segnaposto al momento, ma apprezzo il suggerimento! – roryok

risposta

64

È necessario contrassegnare la tua espressione lambda come async, in questo modo:

messageDialog.Commands.Add(new UICommand("No", async (command) => 
{ 
    await showSaveDialog(); 
})); 
Problemi correlati