Я пытаюсь сделать модуль связи запрос-ответ в C#, используя SerialPort. Это очень простая реализация, просто чтобы продемонстрировать, что она работает (SerialPort не работает должным образом (это виртуальный COM-порт USB) и иногда ест несколько символов, возможно, некоторые ошибки драйвера Windows).Ошибка блокировки в C#
Однако демо не работает: -/
При использовании PropertyGrid на форму, которая считывает свойства объекта, который, в свою очередь, посылает запрос на чтение свойство с удаленного устройства, то очень странно: происходит более одного одновременного вызова SendCommand.
Я попытался использовать блокировку {}, чтобы сделать вызовы секвенциальными, но это не сработает. Даже при блокировке в охраняемую зону входит более одного вызова.
Не могли бы вы рассказать мне, что я делаю неправильно?
Мой код:
SerialPort sp;
public byte[] SendCommand(byte[] command)
{
//System.Threading.Thread.Sleep(100);
lock (sp)
{
Console.Out.WriteLine("ENTER");
try
{
string base64 = Convert.ToBase64String(command);
string request = String.Format("{0}{1}\r", target_UID, base64);
Console.Out.Write("Sending request... {0}", request);
sp.Write(request);
string response;
do
{
response = sp.ReadLine();
} while (response.Contains("QQ=="));
Console.Out.Write("Response is: {0}", response);
return Convert.FromBase64String(response.Substring(target_UID.Length));
}
catch (Exception e)
{
Console.WriteLine("ERROR!");
throw e;
}
finally
{
Console.Out.WriteLine("EXIT");
}
}
}
Выход:
ENTER
Sending request... C02UgAABAA=
Response is: cgAABAAARwAAAA==
EXIT
ENTER
Sending request... C02UgQARwA=
ENTER
Sending request... C02UgAABAA=
Response is: gQARwAAPHhtbD48bWVzc2FnZT5IZWxsbyBYWDIhPC9tZXNzYWdlPjxkZXN0aW5haXRvbj5NaXNpPC9kZXN0aW5hdGlvbj48L3htbD4=
Обратите внимание на два ENTER-s, без выхода между ними? Как это возможно?
Я не уверен, что это устраняет эту проблему, но это как правило, гораздо безопаснее, чтобы зафиксировать на частный объект, не связанный с объектом зра (например, 'частный шкафчиком объекта;'), чтобы избежать любого возможного внутреннего использования блокировки на (в данном случае) объекта 'sp'. – Joe
Изменено, но ситуация не меняется. Спасибо за совет! –