Recentemente abbiamo avuto alcune occasioni in cui è venuta la domanda se in Dynamics CRM 2011, un'esecuzione di plug-in (vale a dire un passaggio del metodo Execute()
) è garantita per rimanere sullo stesso thread.Threading/Ambient Context nei plugin CRM 2011
Vorrei implementare la traccia utilizzando il modello Ambient Context per evitare di passare il servizio di tracciamento a qualsiasi classe che potrebbe voler tracciare. Il problema è che, come sappiamo, il plugin viene istanziato una sola volta per ogni passo registrato e quindi serve tutte le operazioni successive dalla stessa istanza; ciò significa che non posso avere solo alcune proprietà statiche come Tracing.Current
a cui assegno l'istanza attuale ITracingService
e sono a posto. Se lo facessi, l'operazione avviata per ultima sovrascriverebbe l'istanza per tutte le altre operazioni che potrebbero ancora essere in esecuzione (e questo tipo di concorrenza non è raro).
Ora, se potessi essere sicuro che tutto sotto il metodo Execute()
rimane nello stesso thread, ho potuto ancora utilizzare un contesto ambientale che utilizza l'attributo [ThreadStatic]
per i campi statici:
public static class Tracing
{
[ThreadStatic]
private static ITracingService _current;
public static ITracingService Current
{
get
{
if (null == _current)
{
_current = new NullTracingService();
}
return _current;
}
set { _current = value; }
}
}
vorrei impostare questo entrando nella Execute()
e cancellarlo alla fine in modo da rimuovere il riferimento all'istanza del servizio di traccia.
L'unica cosa che potrei tipo di trovare informazioni sul threading nel contesto dei plugin MSCRM è che apparentemente i singoli thread provengono dal ThreadPool - qualsiasi conseguenza che potrebbe avere riguardo al mio problema.
Qualcuno ha una conoscenza più approfondita di come viene gestito il threading con i plug-in MSCRM o di altre idee su come la preoccupazione trasversale della traccia possa essere gestita elegantemente con il codice SOLID in questo caso speciale (AOP/intercettazione dinamica no opzioni qui)?
Grazie per qualsiasi aiuto e indicazioni.
Capisco la tua preoccupazione per l'esecuzione in un thread sicuro, ma non sono sicuro di capire perché sei preoccupato di correre sullo stesso thread. Puoi spiegare un po 'di più? – Daryl
Bene, avrei bisogno di evitare che l'esecuzione del plugin venisse spostata su un altro thread senza che la sua istanza ITracingService fosse "collegata" di nuovo. Non sono ancora riuscito a scoprire come sarebbe stata gestita la cosa ThreadStatic in questo caso. – TeaDrivenDev