2013-05-01 2 views
0

J'ai différentes méthodes qui importent chacune des produits de différents sites. Si je les exécute séquentiellement, l'ensemble du processus prend beaucoup de temps, en particulier lorsqu'une méthode est en cours d'exécution sur un site moins réactif.Comment appeler plusieurs méthodes différentes simultanément

Je préfère les exécuter simultanément.

C'est ce que j'ai jusqu'à présent avec 1 exemple méthode:

Public Class feedParameters 

Private _productIdPrefix As String 
Private _publishersite As String 
Private _feedURL As String 

Public Property productIdPrefix() As String 
    Get 
     Return _productIdPrefix 
    End Get 
    Set(value As String) 
     _productIdPrefix = value 
    End Set 
End Property 
Public Property publishersite() As String 
    Get 
     Return _publishersite 
    End Get 
    Set(value As String) 
     _publishersite = value 
    End Set 
End Property 
Public Property feedURL() As String 
    Get 
     Return _feedURL 
    End Get 
    Set(value As String) 
     _feedURL = value 
    End Set 
End Property 


End Class 




Dim fpm As New feedParameters 
fpm.publishersite = "mypublisher.nl" 
fpm.feedURL = "http://www.domain.com/test.xml" 
fpm.productIdPrefix = "10" 

Protected Sub ImportProductsPublisherA(ByVal productIdPrefix As String, ByVal publishersite As String, ByVal feedURL As String) 

End Sub 

J'ai essayé ceci:

System.Threading.ThreadPool.QueueUserWorkItem(New System.Threading.WaitCallback(AddressOf ImportProductsPublisherA()), fpm) 

Puis-je obtenir 3 erreurs que je ne l'ai pas des arguments spécifiés pour les 3 paramètres: productIdPrefix, publishersite et feedURL

J'ai aussi essayé:

System.Threading.ThreadPool.QueueUserWorkItem(New System.Threading.WaitCallback(AddressOf ImportProductsPublisherA), fpm) 

Cette erreur s'affiche: La méthode 'Protected Sub ImportProductsPublisherA (productIdPrefix As String, publishersite As String, feedURL As String)' n'a pas de signature compatible avec le délégué 'Delegate Sub WaitCallback (état As Object)'.

Toute aide est grandement appréciée!

Répondre

1

Est-ce WinForms ou asp.net? Si les winforms créent un agent d'arrière-plan pour chaque fonction et les lancent toutes, elles fonctionneront indépendamment dans un thread séparé.

Si asp.net vous voulez regarder à l'aide System.Threading.ThreadPool - http://msdn.microsoft.com/en-us/library/system.threading.threadpool.aspx

System.Threading.ThreadPool.QueueUserWorkItem(New System.Threading.WaitCallback(AddressOf ImportProductsSiteA)) 

System.Threading.ThreadPool.QueueUserWorkItem(New System.Threading.WaitCallback(AddressOf ImportProductsSiteB)) 

System.Threading.ThreadPool.QueueUserWorkItem(New System.Threading.WaitCallback(AddressOf ImportProductsSiteC)) 

System.Threading.ThreadPool.QueueUserWorkItem(New System.Threading.WaitCallback(AddressOf ImportProductsSiteD)) 

Si vous fonctions prennent des paramètres que vous pouvez les transmettre comme ceci:

System.Threading.ThreadPool.QueueUserWorkItem(New System.Threading.WaitCallback(AddressOf ImportProductsSiteA), parameter-here) 
+0

Il est asp.net . Et j'ai regardé le lien que vous avez fourni, mais comment j'appellerais mes 4 méthodes en utilisant cette technique? Je ne comprends pas encore la logique :) Merci! – Flo

+0

Veuillez voir la réponse mise à jour. – GJKH

+0

Merci, cela fonctionne en passant 1 paramètre à une fonction, mais si je veux passer plus de paramètres? Dans mon cas, 2 chaînes et 1 entier? – Flo

1
using System.Threading.Tasks; 

namespace Foo 
{ 
    public class Bar 
    { 
     public void ImportProductsSiteA() { } 
     public void ImportProductsSiteB() { } 
     public void ImportProductsSiteC() { } 
     public void ImportProductsSiteD() { } 

     public void Execute() 
     { 
     var a = Task.Factory.StartNew(ImportProductsSiteA); 
     var b = Task.Factory.StartNew(ImportProductsSiteB); 
     var c = Task.Factory.StartNew(ImportProductsSiteC); 
     var d = Task.Factory.StartNew(ImportProductsSiteD); 
     Task.WaitAll(a, b, c, d); 
     } 
    } 
} 
+0

J'ai maintenant: Dim a As System.Threading.Tasks.Task = Tâche. Factory.StartNew (ImportProductsSiteA) Mais alors j'obtiens l'erreur: La résolution de surcharge a échoué parce qu'aucun 'StartNew' accessible ne peut être appelé avec ces arguments: 'Fonction publique StartNew (Of TResult) (fonction As System.Func (Of TResult)) Comme System.Threading.Tasks.Task (Of TResult) ': Les types de données des paramètres de type ne peuvent pas être déduits de ces arguments. Spécifier explicitement le (s) type (s) de données pourrait corriger cette erreur.'Public Function StartNew (action As System.Action) As System.Threading.Tasks.Task ': L'expression ne produit pas de valeur. – Flo

+0

Oui, désolé, c'est la version C#. Je ne suis pas sûr de ce que la syntaxe serait pour VB. – Robin

Questions connexes