在我的静态类中,我有这个:
static var cache = new ConcurrentDictionary<string, object>();
在线程 #1 我这样做:
cache.TryAdd (stringFromSomewhere, newlyCreatedObject);
Console.WriteLine(stringFromSomewhere); // Outputs "abc"
在 Thread #1 之后几秒钟,在 Thread #2 中:
if(cache.ContainsKey(stringFromSomewhereElse))
Console.WriteLine("Yes, it exists.");
else
Console.WriteLine("This did not exist: " + stringFromSomewhereElse);
它输出“这不存在:abc”
然后在线程 #2 之后的线程 #3 中:
foreach(var kvp in cache)
{
Console.WriteLine("string: " + kvp.Key);
if(cache.ContainsKey(kvp.Key))
Console.WriteLine("Yes, it exists.");
else
Console.WriteLine("This did not exist: " + kvp.Key);
}
我得到输出“字符串:abc”和“是的,它存在”。
在 Thread #1 中,我使用 MD5 创建字符串,如下所示:
Convert.ToBase64String (md5.ComputeHash(Encoding.ASCII.GetBytes(value)))
在线程#2 中,我从字节流中获取字符串,其中字符串是使用 UTF8 编码写入的,然后再次使用 UTF8 编码从字节中读取字符串。
在线程#3 中,我通过循环 ConcurrentDictionary 来获取字符串。
我在这里想念什么?据我所知,线程#2 的行为应该与线程#3 一样。
我有两种可能性,在我看来这两种可能性都很大:
- 这是我不知道的某种同步问题吗?
- 或者字符串以某种方式不同?当我将它输出到控制台时,它没有什么不同。
任何人有任何其他想法或解决方案?
编辑:
我像这样将数据写入流:
string data = System.Web.HttpUtility.UrlEncode(theString);
byte[] buffer = Encoding.UTF8.GetBytes (data);
NetworkStream stream = client.GetStream(); // TcpClient client;
stream.Write (buffer, 0, buffer.Length);
然后我像这样从流中读取数据:
string data = "";
NetworkStream stream = client.GetStream(); // TcpClient client;
byte[] bytes = new byte[4096];
do {
int i = stream.Read (bytes, 0, bytes.Length);
data += Encoding.UTF8.GetString (bytes, 0, i);
} while(stream.DataAvailable);
string theString = HttpUtility.UrlDecode(data);