La création de BackgroundWorker avec la File d'attente
J'ai besoin de créer une file d'attente et l'utiliser avec BackgroundWorker. Donc, je peux les opérations d'ajout et quand on se fait suivant commence en arrière-plan. J'ai trouvé ce code par google:
public class QueuedBackgroundWorker<T>
{
public void QueueWorkItem(
Queue queue,
T inputArgument,
Func<T> doWork,
Action workerCompleted)
{
if (queue == null) throw new ArgumentNullException("queue");
BackgroundWorker bw = new BackgroundWorker();
bw.WorkerReportsProgress = false;
bw.WorkerSupportsCancellation = false;
bw.DoWork += (sender, args) =>
{
if (doWork != null)
{
args.Result = doWork(new DoWorkArgument<T>((T)args.Argument));
}
};
bw.RunWorkerCompleted += (sender, args) =>
{
if (workerCompleted != null)
{
workerCompleted(new WorkerResult<T>((T)args.Result, args.Error));
}
queue.Dequeue();
if (queue.Count > 0)
{
QueueItem<T> nextItem = queue.Peek() as QueueItem<T>;
nextItem.BackgroundWorker.RunWorkerAsync(nextItem.Argument);
}
};
queue.Enqueue(new QueueItem<T>(bw, inputArgument));
if (queue.Count == 1)
{
QueueItem<T> nextItem = queue.Peek() as QueueItem<T>;
nextItem.BackgroundWorker.RunWorkerAsync(nextItem.Argument);
}
}
}
public class DoWorkArgument<T>
{
public DoWorkArgument(T argument)
{
this.Argument = argument;
}
public T Argument { get; private set; }
}
public class WorkerResult<T>
{
public WorkerResult(T result, Exception error)
{
this.Result = result;
this.Error = error;
}
public T Result { get; private set; }
public Exception Error { get; private set; }
}
public class QueueItem<T>
{
public QueueItem(BackgroundWorker backgroundWorker, T argument)
{
this.BackgroundWorker = backgroundWorker;
this.Argument = argument;
}
public T Argument { get; private set; }
public BackgroundWorker BackgroundWorker { get; private set; }
}
Mais j'ai un problème avec doWork et workerCompleted. J'obtiens l'erreur:
Délégué 'Func' ne prend pas 1 arguments
Comment puis-je résoudre ce problème? Comment dois-je changer les paramètres? Grâce
- Au moins indiquer sur la ligne. Et peut-être seulement après que ligne. TL;DR
Vous devez vous connecter pour publier un commentaire.
Ici est beaucoup plus rapide méthode qui fait ce que vous voulez:
En ajoutant à chaque nouvelle action comme une continuation de la précédente vous assurer qu'un seul est travaillé sur un temps, comme l'élément suivant ne démarre pas jusqu'à ce que l'élément précédent est terminé, vous vous assurez qu'il n'y a pas de fil assis autour de la marche au ralenti quand il n'y a rien à être travaillé, et vous assurer qu'ils sont tous fait dans l'ordre.
Notez également que si vous ne croyez jamais que vous aurez besoin d'une file d'attente, et pas de n'importe quel nombre, vous pourriez faire de tous les membres
static
, mais c'est à vous de voir.bgQueue.QueueTask(() => CreateConvertingProccess(item.FullName));
. Pouvez-vous m'aider comment puis-je appeler la méthode lorsqu'une tâche est terminée? Devrait je l'ai ajouté après le verrouillage? Je veux dire, quand je veux ajouter une méthode qui, je voudrais ajouter RunWorkerCompleted.public bool IsEmpty() { return previousTask.IsCompleted; }
Il semble que vous êtes absent le deuxième paramètre générique - Tout;
Le code suivant doit prendre soin d'elle:
Et l'usage doit être: