2012-08-03 8 views
9

Ich habe Methode mit Unterschrift, die ich nicht ändern kann. Es sollteUsing async erwarten innen void Methode

protected override void OnInitialize() 

Verwenden von Windows 8 Metro-API sein Ich muss überprüfen, ob Datei vorhanden ist und es innerhalb dieser NoSignatureChange Methode lesen. Mit PlainOldCSharp, würde ich so etwas wie

protected override void OnInitialize() 
{ 
    ... 
    try 
    { 
    var file = folder.OpenFile(fileName); 
    fileExists=true; 
    } 
    catch(FileNotFoundException) 
    { 
    fileExists=false 
    } 
} 

Denken Sie daran, in Windows 8 API only way to check if file exists is handling FileNotFoundException Auch in Windows 8 API alle FileIO API ist async, schreiben, so habe ich file.OpenFileAsync Methode nur.

Also, die Frage ist: Wie soll ich mit diesem Code folder.OpenFileAsync Methode in Windows 8 API schreiben, ohne zu ändern Signaturverfahren zu enthalten

+0

Oh, und AsTask(). Wait() kann 3 verschiedene Ausnahmen selbst auslösen –

+0

Warum genau können Sie die Signatur der Methode nicht ändern? – svick

+0

@svick Ich habe die Frage aktualisiert. –

Antwort

18

Sie noch eine void Methode Asynchron machen können:

protected async void CannotChangeSignature() 
{ 
    ... 
} 

gültige Rückgabetypen für eine async Methode sind:

  • void
  • Task
  • Task<T>

jedoch, wenn Sie es tatsächlich Block machen wollen, dann kämpfen Sie im Grunde gegen die Plattform - der springende Punkt ist zu Blockierung zu vermeiden.

Sie sagen, dass Sie die Signatur nicht ändern können - aber wenn Sie sich auf diese Blockierung verlassen, dann haben Sie , um die Art zu ändern, wie Sie sich der Codierung nähern.

Im Idealfall sollten Sie die Signatur Task<bool> ändern:

protected async Task<bool> CannotChangeSignature() 
{ 
    ... 
    try 
    { 
    await ApplicationData.Current.LocalFolder.GetFileAsync(fileName); 
    return true; 
    } 
    catch(FileNotFoundException) 
    { 
    return false; 
    } 
} 

EDIT: Wenn Sie wirklich eine Blockierung einen braucht, werden Sie nur AsTask().Wait() nennen müssen, die AggregateException fangen und prüfen, ob es sich um eine enthält FileNotFoundException. Es ist wirklich ziemlich schrecklich, obwohl ... können Sie nicht um dieses Design, so dass es nicht muss blockiert werden? Suchen Sie beispielsweise nach der Datei und zeigen Sie einen Fehler (oder was auch immer) an, falls und wenn Sie nicht finden.

+1

Abgesehen davon würde ich "Can not" nicht in einem Methodennamen verwenden. Ich bin mir nicht sicher, ob das gegen Konvention ist oder nicht, aber es macht es nur ein bisschen schwieriger zu verstehen, was auf den ersten Blick passiert. Aber das ist meine bescheidene Meinung, denke ich ;-) –

+0

Jon, danke für die Antwort. Ja, ich muss es blockieren, und Grund ist, dass ich andere Komponenten in meiner App verwende und sie Schnittstellen definieren. –

+0

Async void ist gefährlich, weil es nicht blockiert und du es nicht blockieren kannst, wie ich weiß. –