gpt4 book ai didi

c# - 同一时刻调用两次的方法

转载 作者:太空宇宙 更新时间:2023-11-03 21:36:51 25 4
gpt4 key购买 nike

我正在开发一个 Windows 窗体应用程序,并且遇到了一个非常严重的错误。该应用程序应该在本地计算机上运行并处理来自服务器应用程序的请求。客户端应用程序如下所示:

public Reader mr_obj;

public Form1()
{
mr_obj = new MyReader.Reader(7137);
mr_obj.UserEvent += new ReaderEvent(UserEvent);
}

private void UserEvent(UserEvent e, long threadID)
{
Thread.Sleep(1000);
SafeSomethingToDB();
}

Reader() 对象正在将客户端应用程序连接到服务器应用程序。因此在此之后,服务器应用程序能够触发客户端应用程序中的 UserEvent() 方法。现在的问题是,如果 UserEvent() 方法在一秒内被触发两次,则处理 UserEvents 的客户端应用程序会崩溃。(它实际上不会崩溃,只是挂起,直到你终止任务,try catch 不会返回错误)

到目前为止,我尝试过的是将 Thread.Sleep() 和 SafeSomethingToDB() 委托(delegate)给另一个线程。这不起作用,因为服务器应用程序不会等到胎面完成。所以服务器应用程序没有在数据库中找到数据,因为它没有等待 1 秒......当我对后台工作人员执行此操作时,也会出现同样的问题。

是否有可能同时以某种并行方式处理来自同一服务器应用程序的这两个触发器?

非常感谢任何建议

编辑:我认为锁定方法不会导致应用程序同时处理两个触发器。为了使它可见,我试过这个:

private void UserEventHandler(UserEvent e, long threadID)
{
lock (_lockObject)
{
MessageBox.Show("Messagebox 1");
MessageBox.Show("Messagebox 2");
}
}

当第一个请求触发 UserEvent() 时,“MessageBox1”出现。如果按确定,将出现“MessageBox2”。但是,如果 UserEvent 在“Messagebox2”仍处于打开状态时第二次被触发,则“MessageBox1”不会出现。相反,应用程序开始挂起。当两个触发器真的同时处理时,“MessageBox1”是否应该再次出现由 UserEvent() 的第二个触发器触发?所以这两个触发器不是并行执行的,还是我弄错了?

最佳答案

不知道您为什么执行 SleepSafeSomethingToDB 究竟做了什么以及导致问题的原因,请尝试同步调用:

private readonly object _lockObject = new object();

private void UserEvent(UserEvent e, long threadID)
{
lock(_lockObject)
{
Thread.Sleep(1000);
SafeSomethingToDB();
}
}

关于c# - 同一时刻调用两次的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21259249/

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