所以爲了對每個線程的程序運行我成立了一個上下文一個單獨的上下文 - 主題映射類如下是否有可能爲有管理的線程有自己的競爭條件
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
如果沒有一個以上的線程參與你'重新說話是不可能的 –