0
votes

Fournir de multiples filetage ou création de tâches

J'essaie de mettre en œuvre quelques fichiers (fichiers vidéo) pour générer des informations de média. J'ai eu une liste de liste nommée (détails) et chaque fichier est ajouté 3-4 fois en fonction de leur genre comme celui-ci:

Action Avengers Infinity War 2.6 Go P>

Aventure Avengers Infinity War 2.6 Go P >

Sci-fi Avengers Avengers Infinity War 2.6 Go P>

Mission d'action impossible Fallout 4.7 Go P>

Mission d'aventure impossible Fallout 4.7 Go P>

Mission Thriller Impossible Fallout 4.7 GB P>

State de jouet Adventure 1.4 Go P>

Histoire de jouet de comédie 1,4 gb p>

J'ai essayé de mettre en œuvre peu de codes ce comme p> xxx Pré>

et utiliser la normale pour la boucle p> xxx pré>

Je souhaite que la sortie ne traite que 2 film à une seule heure et aucune restriction pour le genre de ce film particulier. P>

Exemple comme Avengers War de l'infini et la mission impossible tombe au début à générer. Après l'un des Avengers Infinity War ou la mission impossible Fallout complète la téléchargement de ses informations sur les médias, je souhaite démarrer la troisième histoire de jouets 4 et ainsi de suite. (2 À l'heure actuelle et lorsque 1 Terminer ajoutez 1 autre 1) p>

Générez la méthode: P>

private void BackgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            MessageBox.Show(e.UserState.ToString());
}


4 commentaires

Recherchez TPL Dataflow.


Utilisation d'un travail d'arrière-plan défaite le but d'utiliser parallel.for . Pour décharger du travail sur les threads de fond, vous devez utiliser une manière ou l'autre. Mélanger les deux est déroutant de dire le moins. De plus, vous n'avez toujours pas inclus le code qui fait le travail réel de traitement des films.


Veuillez nous fournir un exemple de reproductible minimal . Si nous avions tous votre code, nous pourrions vous offrir un moyen très simple d'atteindre ce que vous avez après. Vous semblez avoir beaucoup de choses à suivre pour une tâche très simple. Nous pouvons vous aider si vous nous aidez.


J'ai essayé d'utiliser une boucle et cela le fait un par un et cela fonctionne parfaitement. Mais je veux faire plusieurs en même temps et son énorme code et incapable de le partager ici. Quelqu'un peut-il m'ajouter sur Skype (Skype ID: Saurav.neo@live.com). Pour que je puisse fournir plus de scénario de détail et m'aider à obtenir plusieurs traitements en même temps. :)


3 Réponses :


0
votes

Vous pouvez utiliser la surcharge de parallèle.for code> qui accepte un paralloptions code> argument. Il permet de configurer le degré de parallélisme.

var options = new ParallelOptions() { MaxDegreeOfParallelism = 2 };
Parallel.For(0, Details.Items.Count, options, i =>
{
    FileName = Details.Items[i].SubItems[7].Text;
    Stop.Start();
    new Methods.Generate(FileName, FileHost, Sender as BackgroundWorker);
});


6 commentaires

Merci pour le commentaire. J'ai essayé d'utiliser votre code et il ne montre que la mission impossible Fallout Fichier et non le fichier Avengers Infinity War. Lire un deuxième fichier uniquement.


La méthode parallel.for exécute votre boucle dans 2 filets parallèles. Mais je n'ai aucune idée de ce qui est à l'intérieur de la boucle. Qu'est-ce que stop.start () fait et pourquoi vous devez lancer la variable émetteur comme wworker ? Il y a probablement beaucoup plus de code que vous n'avez pas montré.


Stopwatch stop = nouveau chronomètre (); Pour stopwatch stop.start () et l'expéditeur en tant que travailleur d'arrière-plan consiste à fournir des backgroundworker.ReportProgress de la classe générale.


Generate Class a suivi: Générateur public (Nom de fichier String String (String FileHost, Backworker BW) {Random Rand = Nouveau Random (); Fil.sleep (1000); Bw.reportProgress (rand.next (0, 40), nouveau nominfo (nom de fichier) .name); }


@Cooldevil Je vous suggère de mettre à jour votre question en ajoutant la méthode générer . Les commentaires ne conviennent pas au code de publication.


Fait vérifier avec des informations supplémentaires. e.userstate.tostring () fournit le nom de fichier qui est terminé.



0
votes
var options = new ParallelOptions();
options.MaxDegreeOfParallelism = 2;
Parallel.For(0, Details.Items.Count, options, i =>
            {
                FileName = Details.Items[i].SubItems[7].Text;
                Stop.Start();
                new Methods.Generate(FileName, FileHost, Sender as BackgroundWorker);
            });

0 commentaires

0
votes

Je retire parallel.for et maintenant m en utilisant .. Pour boucle et cela fonctionne parfaitement bien sauf que je ne suis en train de faire un seul traitement. Cela fonctionnera également.

for (int Indices = 0; Indices < Details.Items.Count; Indices++)
                        {
                            FileName = Details.Items[Indices].SubItems[7].Text;

                            Stop.Start();

                                Thread Generating = new Thread(() => new Methods.Generate(FileName, FileHost, Sender as BackgroundWorker))
                            {
                                IsBackground = true
                            };

                            Generating.Start();
                            Generating.Join();
                        }


0 commentaires