Mam obiekt polecenia, wykonujący pracę na podstawie żądania z kolejki żądań. To konkretne polecenie wykona swoją pracę w domenie podrzędnej. Część wykonywania jego pracy w domenie podrzędnej obejmuje blokowanie operacji ConcurrentQueue (np. Dodaj lub weź). Muszę być w stanie propagować przerwany sygnał w kolejce zgłoszeń, w poprzek do aplikacji podrzędnej podrzędnej i aby w nim obudzić wątki robocze.Jak przekazać CancellationToken przez granicę AppDomain?
Dlatego uważam, że muszę przekazać Token Anulowania przez granicę AppDomain.
Próbowałem tworzenia klasy, która dziedziczy z 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;
}
};
i przechodzącej to jako argument na funkcję pracownika:
// 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);
Ale wciąż otrzymuję wyjątek, gdy objectInRemoteAppDomain próbuje dostęp do właściwości Token getter:
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.
Moje pytanie to: Jak mogę propagować sygnał przerwania/anulowania w aplikacjach i budzić wątki, które mogą być blokowane w strukturach danych współbieżności platformy .NET (gdzie obsługiwane są argumenty AnulowanieToken).
To najlepsze rozwiązanie, o ile mogę to stwierdzić. – usr