Ho un oggetto comando, che lavora in base a una richiesta da una coda di richieste. Questo particolare comando eseguirà il suo lavoro in un appdomain secondario. Parte del suo lavoro nell'appadominio figlio comporta il blocco su un'operazione ConcurrentQueue (ad esempio, Aggiungi o Prendi). Devo essere in grado di propagare un segnale di interruzione attraverso la coda di richiesta, attraverso il dominio secondario, e di risvegliare i thread di lavoro al suo interno.Come posso passare CancellationToken attraverso il confine AppDomain?
Pertanto, penso di dover passare un CancellationToken attraverso il confine AppDomain.
Ho cercato di creare una classe che eredita da MarshalByRefObject:
protected class InterAppDomainAbort : MarshalByRefObject, IAbortControl
{
public InterAppDomainAbort(CancellationToken t)
{
Token = t;
}
[SecurityPermissionAttribute(SecurityAction.Demand, Flags = SecurityPermissionFlag.Infrastructure)]
public override object InitializeLifetimeService()
{
return null;
}
public CancellationToken Token
{
get;
private set;
}
};
e passare questo come un argomento della funzione operaio:
// cts is an instance variable which can be triggered by another thread in parent appdomain
cts = new CancellationTokenSource();
InterAppDomainAbort abortFlag = new InterAppDomainAbort(cts.Token);
objectInRemoteAppDomain = childDomain.CreateInstanceAndUnwrap(...);
// this call will block for a long while the work is being performed.
objectInRemoteAppDomain.DoWork(abortFlag);
Ma ho ancora un'eccezione quando l'objectInRemoteAppDomain cerca di accedere alla proprietà getter Token:
System.Runtime.Serialization.SerializationException: Type 'System.Threading.CancellationToken' in Assembly 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' is not marked as serializable.
La mia domanda è: Come posso propagare il segnale di interruzione/annullamento attraverso le appdomain e attivare i thread che possono essere bloccati nelle strutture di dati di concorrenza .NET (dove sono supportati gli argomenti di CancellazioneToken).
Questa è la soluzione perfetta per quanto posso dire. – usr