2010-03-10 5 views
2

J'ai 2 fonctions qui doivent être exécutées l'une après l'autre. Dans cette fonction, les appels asynchrones sont faits. Comment puis-je exécuter la deuxième fonction après l'appel asynchrone?Mettre en file d'attente un fichier .net

Par exemple.

public void main() 
{ 
    executeFn("1"); 
    executeFn("2"); //I want this to be executed after 1 has finished. 
} 


private bool executeFn(string someval) 
{ 
    runSomeAsyncCode(); //This is some async uploading function that is yet to be defined. 
} 
+0

Est-ce que vous écrivez les méthodes runSomeAsyncCode, ou proviennent-elles d'un tiers? –

+3

"2 fonctions qui doivent être exécutées l'une après l'autre" - n'est-ce pas une simple exécution séquentielle? –

+1

Le code à l'intérieur de executeFn est thread, donc j'ai besoin de mettre les appels dans une file d'attente pour qu'ils deviennent séquentiels. – GatesReign

Répondre

3

Vous pouvez utiliser .

Mais alors je ne vois pas le point de l'exécution asynchrone de ces 2 fonctions car elles deviennent séquentielles.

0

Votre méthode asynchrone que vous appelez doit avoir quelque chose à notifier à l'appelant quand elle est terminée, ai-je raison? (sinon, il suffirait d'exécuter et d'oublier, ce qui est peu probable) Si tel est le cas, vous devez simplement attendre que la notification apparaisse et exécuter la deuxième méthode.

+0

Je suppose qu'il cherche un moyen d'envoyer de nombreuses exécutions de cette opération, et qu'ils pourraient être créés dynamiquement. Et s'ils le sont, de les mettre en file d'attente pour terminer l'opération en cours – caesay

0

essayez ceci:

public void main() 
{ 
    executeFn("1"); 
    executeFn("2"); 
} 
List<string> QueuedCalls = new List<string>(); // contains the queued items 
bool isRunning = false; // indicates if there is an async operation running 
private bool executeFn(string someval) 
{ 
    if(isRunning) { QueuedCalls.Add(someval); return; } // if there is an operation running, queue the call 
    else { isRunning = true; } // if there is not an operation running, then update the isRunning property and run the code 
    runSomeAsyncCode(); //undefined async operation here<- 
    isRunning = false; //get here when the async is completed, (updates the app telling it this operation is done) 
    if(QueuedCalls.Count != 0)//check if there is anything in the queue 
    { 
     //there is something in the queue, so remove it from the queue and execute it. 
     string val = QueuedCalls[0]; 
     QueuedCalls.RemoveAt(0); 
     executeFn(val); 
    } 
} 

cette façon ne bloquer les fils, et sera tout simplement exécuter l'appel mis en attente lorsque les premiers finnishs, qui est ce que je crois que vous voulez! codage heureux! Maintenant, je recommande d'exécuter la dernière section, à l'endroit où elle définit l'isRunning à false, à l'intérieur de votre opération asynchrone, ou le déclencher avec un événement ou quelque chose, le seul attrapé est que le code doit être exécuté lorsque votre opération asynchrone est terminée. donc vous voulez faire cela à vous de décider

+0

Le framework .NET fournit de nombreuses options pour la gestion des threads, il est plus facile d'utiliser ce qui est intégré. Je vous recommande plutôt d'utiliser un BackgroundWorker. //www.albahari.com/threading/part3.aspx#_BackgroundWorker –

+0

@James Kolpack: oui, mais ceci est une réponse littérale à la question OPS – caesay

+0

ce code n'exécutera-t-il pas les deux fonctions immédiatement?en supposant que runSomeAsyncCode() retourne immédiatement alors isRunning est mis à false tout de suite après, le second appel fait alors exactement la même chose – Matt

0

Vous pouvez envisager d'utiliser des délégués génériques exécuter la première méthode async puis dans le rappel exécuter l'autre méthode async. Si vous êtes vraiment inquiet de les synchroniser les uns avec les autres.

0

Une façon simple est d'utiliser une coutume threadpool

http://www.codeplex.com/smartthreadpool

Vous pouvez instancier un threadpool séparé, définissez la taille de threadpool à 1, et la file d'attente des travailleurs

1

Let runSomeAsyncCode() retourner un IAsyncResult et mettre en œuvre les méthodes BeginXEndX similaires au CLR Asynchronous Programming Model. Utilisez la méthode EndX pour attendre l'exécution du code.

Questions connexes