Comment obtenir la référence de tâche actuelle?
Comment puis-je obtenir une référence à la tâche que mon code est exécuté à l'intérieur?
ISomeInterface impl = new SomeImplementation();
Task.Factory.StartNew(() => impl.MethodFromSomeInterface(), new MyState());
...
void MethodFromSomeInterface()
{
Task currentTask = Task.GetCurrentTask(); //No such method?
MyState state = (MyState) currentTask.AsyncState();
}
Depuis que je suis en appelant la méthode de l'interface, je ne peux pas juste passer à la tâche nouvellement créée comme un paramètre supplémentaire.
source d'informationauteur Reuven Bass
Vous devez vous connecter pour publier un commentaire.
Puisque vous ne pouvez pas changer l'interface, ni la mise en œuvre, vous devrez le faire vous-même, par exemple, à l'aide de
ThreadStaticAttribute
:Ici est un "hacky" classe qui peut être utilisée pour cela.
Utilisez simplement le CurrentTask propriété afin d'obtenir le courant de l'exécution de la Tâche.
Je déconseille fortement de l'utiliser n'importe où près de la production de code!
L'exemple suivant montre comment il peut être atteint, la résolution de la question avec la réponse fournie par @stephen-cleary. C'est un peu compliqué, mais essentiellement, la clé est dans la TaskContext de classe ci-dessous qui utilise CallContext.LogicalSetDataCallContext.LogicalGetData et CallContext.FreeNamedDataSlot qui sont utiles pour la création de vos propres contextes. Le reste de la peluche est de répondre à l'OP question:
Si vous pouvez utiliser .NET de 4,6 ou plus .NET Standard ou .NET de Base, ils ont résolu ce problème avec AsyncLocal.
https://docs.microsoft.com/en-gb/dotnet/api/system.threading.asynclocal-1?view=netframework-4.7.1
Si non, vous devez configurer un magasin de données quelque part avant de l'utiliser et d'y accéder via une fermeture, pas un fil ou d'une tâche. ConcurrentDictionary aidera à couvrir les erreurs que vous faites cela.
Lorsque le code attend, la tâche en cours libère le fil - à-d. les threads ne sont pas liés à des tâches, dans le modèle de programmation au moins.
Démo: