我有一個命令對象,根據來自請求隊列的請求進行工作。這個特定的命令將在一個子appdomain中執行它的工作。在兒童appdomain中完成其工作的一部分涉及對ConcurrentQueue操作(例如,添加或取出)的阻塞。我需要能夠通過請求隊列傳播中止信號,傳遞給子appdomain,並喚醒其中的工作線程。如何通過AppDomain邊界傳遞CancellationToken?
因此,我認爲我需要跨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嘗試訪問令牌獲取器屬性:
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參數)中被阻塞的線程。
就我所知,這是完美的解決方案。 – usr 2013-03-02 22:38:53