gpt4 book ai didi

c# - c#中的锁定错误

转载 作者:太空狗 更新时间:2023-10-29 22:27:14 25 4
gpt4 key购买 nike

我正在尝试使用 SerialPort 在 C# 中执行请求-响应通信模块。这这是一个非常简单的实现,只是为了证明它有点工作(SerialPort 工作不正常(它是一个 USB 虚拟 COM 端口),有时会吃掉一些字符,可能是一些 Windows 驱动程序错误)。

但是演示不起作用:-/

当在窗体上使用 propertygrid 时,它读取对象的属性,然后发送请求以从远程设备读取属性,会发生一些非常奇怪的事情:一次同时调用多个 SendCommand .

我尝试使用 lock{} block 使调用顺序进行,但它不起作用。即使有锁,也有不止一个调用进入保护区。

你能告诉我我做错了什么吗?

我的代码:

    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,它们之间没有 EXIT 吗?这怎么可能?

最佳答案

您需要牢记lock 关键字的作用,它只允许一个线程 进入锁。问题是,您没有使用任何线程。所有这些代码都在 UI 线程(程序的主线程)上运行。

您需要了解的下一个细节是 UI 线程很特殊,它是可重入sp.ReadLine(); 调用将阻塞 UI 线程。这是非法的,GUI 程序的 UI 线程作为“单线程单元”运行,由程序的 Main() 方法上的 [STAThread] 属性启用。 STA线程的契约禁止它阻塞,这很可能导致死锁。

为了遵循 STA 的要求,每当在 UI 线程上运行的代码执行阻塞操作时,CLR 都会执行一些特殊操作,例如 SerialPort.ReadLine() 所做的。它泵送消息循环以确保 Windows 发送的消息不断得到调度。该消息循环与 Application.Run() 执行相同的操作。

也许您可以看到它的前进方向,允许 PropertyGrid 再次调用您的 SendCommand() 方法。锁根本不起作用,这发生在同一个线程上。

解决这个问题并不容易,我们看不到触发 SendMessage() 的代码。但是你需要以某种方式防止这种情况发生。 this question 中有关此行为的更多背景信息.

关于c# - c#中的锁定错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14032988/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com