В моем статическом классе у меня есть это:
static var cache = new ConcurrentDictionary<string, object>();
В теме №1 делаю так:
cache.TryAdd (stringFromSomewhere, newlyCreatedObject);
Console.WriteLine(stringFromSomewhere); // Outputs "abc"
Через пару секунд после темы №1 в теме №2:
if(cache.ContainsKey(stringFromSomewhereElse))
Console.WriteLine("Yes, it exists.");
else
Console.WriteLine("This did not exist: " + stringFromSomewhereElse);
Он выводит «Этого не существует: abc»
Затем в потоке № 3 через пару секунд после потока № 2:
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» и «Да, он существует».
В потоке № 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);
Console.WriteLine("This did not exist: '{0}', Length={1}", stringFromSomewhereElse, stringFromSomewhereElse.Length);
- person Jim Mischel   schedule 02.07.2013