2012-08-03 8 views
9

Tengo un método con firma que no puedo cambiar. Debe serUsando async aguarde dentro del método de vacío

protected override void OnInitialize() 

El uso de la API de Windows 8 Metro tengo que comprobar si existe el archivo y leerlo, dentro de este método NoSignatureChange. Usando PlainOldCSharp, me gustaría escribir algo así como

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

Recuerde, en Windows 8 API only way to check if file exists is handling FileNotFoundException Además, en Windows 8 API API todo FileIO es asíncrono, así que tengo único método file.OpenFileAsync.

Entonces, la pregunta es: ¿Cómo debo escribir el código usando el método folder.OpenFileAsync en Windows 8 API sin cambiar la firma del método que contiene

+0

Ah, y AsTask(). Wait() puede arrojar 3 excepciones diferentes en sí mismo –

+0

¿Por qué exactamente no se puede cambiar la firma del método? – svick

+0

@svick He actualizado la pregunta. –

Respuesta

18

Todavía se puede hacer una void método asíncrono:

protected async void CannotChangeSignature() 
{ 
    ... 
} 

tipos de retorno válidos para un método asíncrono son:

  • void
  • Task
  • Task<T>

Sin embargo, si usted quiere que sea realmente bloque, a continuación, que está básicamente luchando contra la plataforma - el punto es para evitar bloqueo.

Dice que no puede cambiar la firma, pero si confía en este bloqueo, entonces tiene para cambiar la forma en que se aproxima a la codificación.

Lo ideal es que debe cambiar la firma a Task<bool>:

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

EDIT: Si realmente necesita un bloqueo de uno, vas a tener que llamar a AsTask().Wait(), coger el AggregateException y comprobar si contiene una FileNotFoundException. Sin embargo, realmente es bastante horrible ... ¿no puedes diseñar esto para que no se bloquee?? Por ejemplo, comience a buscar el archivo y muestre un error (o lo que sea) si encuentra que no existe.

+1

Dicho esto, aparte de eso, no usaría 'No puedo' en el nombre de un método. No estoy seguro si eso va en contra de la convención o no, pero hace que sea un poco más difícil entender lo que está pasando a primera vista. Pero esa es mi humilde opinión, supongo ;-) –

+0

Jon, gracias por responder. Sí, necesito que sea un bloqueo, y la razón es que estoy usando otros componentes en mi aplicación y definen interfaces. –

+0

El vacío asíncrono es peligroso porque no bloquea, y no lo puedes bloquear, como yo sé. –

Cuestiones relacionadas