У меня есть объект команды, выполняющий работу на основе запроса из очереди запросов. Эта конкретная команда выполнит свою работу в дочернем домене. Часть выполнения своей работы в дочернем appdomain включает блокировку операции ConcurrentQueue (например, "Добавить или принять" ). Мне нужно иметь возможность распространять сигнал прерывания через очередь запросов, через дочернюю область приложения и пробуждать рабочие потоки в ней.
Поэтому, я думаю, мне нужно передать CancellationToken через границу AppDomain.
Я попытался создать класс, который наследует от 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;
}
};
и передавая это как аргумент рабочей функции:
// 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);
Но я все еще получаю исключение, когда objectInRemoteAppDomain пытается получить доступ к свойству geten 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.
Мой вопрос: как я могу распространять сигнал прерывания/отмены в приложениях и пробуждать потоки, которые могут быть заблокированы в структурах данных .NET concurrency (где аргументы CancellationToken поддерживаются).