Créer une Tâche avec une Action<T>
J'ai un peu l'impression que je suis absent quelque chose de fondamental. Voici mon problème.
Je suis en train de créer un Système.Le filetage.Les tâches.Instance de la tâche à exécuter une action qui accepte un paramètre d'un certain type. Je pensais que je pouvais faire quelque chose comme
void DoWork(MyClass obj) {} //My action that accepts a parameter of type 'MyClass'
MyClass obj = new MyClass();
Action<MyClass> action = DoWork; //action that points to the method
Task task = new Task(action,obj); //task that would execute 'DoWork' with 'obj' as the parameter when I call Start.
Évidemment, cela ne compile pas. Il semble que je ne peut utiliser qu'une Action<object>
et pas un Action<T>
pour une tâche, puis coulé "l'objet" de T à l'intérieur de ma méthode.
Comment puis-je obtenir ce que je désire le plus efficacement et efficacement?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez également utiliser directement:
obj
avant de commencer la tâche, ou même juste avant laTask
logique appelé le délégué,DoWork
allons travailler sur le nouvel objet. Cela peut conduire à des bugs qui sont très difficile à suivre. Un classique de la situation, si vous utilisez ce à l'intérieur d'une boucleforeach(MyClass o in myObjList) { (new Task(()=>DoWork(o))).Start(); }
.Vous pouvez utiliser
Si vous êtes en utilisant .NET 4.0 ou supérieur, vous pouvez utiliser La Contravariance pour atteindre votre objectif sans l'introduction d'un nouveau déléguéEDIT:
Merci pour @svick de remarquer, que la deuxième option n'est pas correct: j'étais trop occupé à faire le tri, si une Action est co - contravariant (en fait, c'est contravariant, j'avais raison au sujet de cette tout au moins) que j'ai supervisé, que j'aurais besoin de Covariance dans ce cas.
Contravariance signifie que vous pouvez faire
sans une conversion explicite.
Task
est dans le cadre de depuis .Net 4.0, donc je pense que le qualificatif n'est pas nécessaire.Action<object>
àAction<MyClass>
, mais pas l'inverse.