所以为了对每个线程的程序运行我成立了一个上下文一个单独的上下文 - 主题映射类如下是否有可能为有管理的线程有自己的竞争条件
public class ContextMap : IContextMap
{
private static IContextMap _contextMap;
private Dictionary<int, IArbContext2> ContextDict;
private static string DbName;
private ContextMap()
{
if (string.IsNullOrWhiteSpace(DbName))
throw new InvalidOperationException("Setup must be called before accessing ContextMap");
ContextDict = new Dictionary<int, IArbContext2>();
}
protected internal static void Setup(IContextMap map)
{
_contextMap = map;
}
public static void Setup(string dbName)
{
DbName = dbName;
}
public static IContextMap GetInstance()
{
return _contextMap ?? (_contextMap = new ContextMap());
}
public IArbContext2 GetOrCreateContext()
{
var threadId = Thread.CurrentThread.ManagedThreadId;
if(!ContextDict.ContainsKey(threadId))
ContextDict.Add(threadId,new ArbContext(DbName));
return ContextDict[threadId];
}
public void DestroyContext()
{
if (ContextDict.ContainsKey(Thread.CurrentThread.ManagedThreadId))
ContextDict.Remove(Thread.CurrentThread.ManagedThreadId);
}
不知何故,代码是(很少但仍然发生)在GetOrCreateContext方法中抛出keynotfound异常。是否有可能将线程转移到单独的动作(例如,监督线程迫使它执行另一个动作,在线程检查Dict是否有键但尚未返回之前调用DestroyContext),然后恢复它离开的地方。我从来没有特意这样做,但我不明白任何其他原因如何引发此错误。
谢谢。
你是不是一个展示如何调用'GetOrCreateContext'和'DestroyContext'。可能它从多线程调用没有适当的同步...附注:从我可以看到你正在重新实现线程本地存储([SO Q:ThreadLocal](http://stackoverflow.com/questions/2158981/does- c-sharp-have-a-threadlocal-analog-for-data-members-to-the-threadstatic)作为起点)。 –
这难道不使DIF如可以在代码中看到上下文被创建和存储由线程ID,它不可能对任何线程影响任何情况下,它不拥有 – Alex
如果没有一个以上的线程参与你'重新说话是不可能的 –