2012-10-29 2 views
2

Je souhaite écrire du contenu dans un fichier local, puis le représenter dans un bloc de texte. J'ai deux méthodes, CreateFile et Output, la première méthode utilise la méthode WriteTextAsync pour écrire le contenu dans un fichier, et la seconde méthode utilise la méthode ReadTextAsync pour lire le contenu. J'ai appelé les deux méthodes, un par un, commeEcriture et lecture de fichier async

CreateFile(data); 
Output(file); 
fichier

est une variable globale, la méthode CreateFile va écrire les « données » dans le fichier et la sortie de la méthode de sortie du contenu de celui-ci. Malheureusement, cela ne fonctionne pas toujours, parfois, j'ai une exception qui dit "Référence d'objet non définie à un objet", après recherche, j'ai trouvé parfois, le fichier est nul, je pense qu'il peut être causé par Output La création de fichier ne se termine pas. Donc, si j'ajoute un point d'arrêt, ça fonctionne toujours. Tout le monde peut m'aider à laisser la méthode Output s'exécuter après la création du fichier terminée?

Merci

Répondre

9

L'une des raisons peut-être que le fichier n'a pas encore été créé, lorsque la seconde méthode essaie de le lire:

Diagram 1

Ainsi, la deuxième méthode ont à attente pour la première méthode pour terminer:

Diagram 2

Il y a plusieurs façons d'y parvenir.

L'un d'entre eux utiliseront Task Class de Task Parallel Library et son Wait Method:

var task = new Task(() => CreateFile(data)); 
task.Wait(); 

Un autre, par exemple, ManualResetEvent Class:

ManualResetEvent permet aux threads de communiquer entre eux par la signalisation . Typiquement, cette communication concerne une tâche qu'un thread doit terminer avant que d'autres threads puissent continuer.

Quelques autres liens connexes:

+0

+1 Réponse très détaillée. – 3aw5TZetdf

+0

@MatthewRz Merci Matthew. – maximpa

+0

Réponse parfaite! – James

1

Étant donné que vos méthodes appellent des méthodes asynchrones, une solution simple consiste à appeler vos méthodes comme ceci:

await CreateFile(data); // This waits for the method to complete before continuing. 
Output(file); 
+0

@MatthewRz: La balise 'windows-8' implique C# 5.0. –