我有一个命令对象,根据来自请求队列的请求进行工作。此特定命令将在子 appdomain 中执行其工作。在子应用程序域中完成其工作的一部分涉及阻塞 ConcurrentQueue 操作(例如,添加或获取)。我需要能够通过请求队列将中止信号传播到子应用程序域,并唤醒其中的工作线程。
因此,我认为我需要跨 AppDomain 边界传递一个 CancellationToken。
我尝试创建一个继承自 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 尝试访问 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.
我的问题是:如何在 appdomains 中传播中止/取消信号并唤醒可能在 .NET 并发数据结构中被阻塞的线程(支持 CancellationToken 参数)。