gpt4 book ai didi

c# - 如何解决 C# Premature Object Dispose

转载 作者:行者123 更新时间:2023-11-29 04:49:42 25 4
gpt4 key购买 nike

我的代码有问题,但我不知道哪里出了问题。

我正在为客户编写应用程序。在启动画面期间,应用程序检查 Mysql 是否正在运行以便稍后能够连接到它。如果 mysql 处于打开状态,应用程序将继续启动。如果 mysql 没有运行,我会启动它并再次检查。

最初,我正在寻找 mysql pid,但出于某种原因,如果不使用非托管代码我就无法获得它。

所以我在xampp源代码中找到了另一种方法,我决定使用它。

在 vstudio 调试器下运行应用程序步进或在断点处停止运行完美,但如果在没有步进的情况下运行,应用程序会启动 mysql 服务器但无法检测到它并最终停止应用程序(我不希望应用程序继续加载如果数据库失败)。

这种行为让我想到一个或多个变量在我可以再次使用之前在运行时被释放。

我不知道如何解决这个问题,需要帮助。

编辑:问题是 mysql 尚未启动,但没有中断地运行应用程序正如 Jan & SWEKO 所说。添加一些延迟效果很好

启动画面加载代码。

// App booting tasks
void Load()
{

// License validation ok
Boolean licensecheck = BootChecks.LicenseCheck();

if (! licensecheck)
{
MessageBox.Show("License Error Conta ct Technical Support","Error",MessageBoxButtons.OK,MessageBoxIcon.Stop);
Application.Exit();
}

bar.Width += 10; // feed progress bar ( it's a custom drawn label )
this.Refresh(); // update form to paint it
Application.DoEvents(); // process all pooled messages

// Mysql check
Boolean dbcheck = BootChecks.DbCheck();

// THE ISSUE IT'S HERE RUNNING WITHOUT STEPPING , ALWAYS FIRES THE ERROR
if ( ! dbcheck )
{
MessageBox.Show("Can't init Mysql. Contact Technical Support", "Error", MessageBoxButtons.OK, MessageBoxIcon.Stop);
Application.Exit();
}

bar.Width += 10;
this.Refresh();
Application.DoEvents();

// more stuff

}

数据库校验码

public static bool DbCheck()
{

Boolean norun = MysqlController.CheckMysqlIsRunning(Constants.dbpidfile);

// check if running
if ( norun ) return true;

// if not running, I start it
MysqlController.StartMysql(Constants.dbexe,Constants.dbopts);

Boolean rerun = MysqlController.CheckMysqlIsRunning(Constants.dbpidfile);

// if really running all it's ok
if ( rerun ) return true;

// really a fault
return false;

}

真正的mysql检查

评论:这种方式是在xampp包上找到的。要知道 mysql 是否正在运行,请找到 mysql pid 文件,并打开一个命名事件。如果正确,则 mysql 正在运行。

public static Boolean CheckMysqlIsRunning(String pathtopidfile)
{
try
{
Int32 pid;
using ( StreamReader sr = new StreamReader(pathtopidfile) )
{
pid = int.Parse(sr.ReadToEnd());
}

IntPtr chk = OpenEvent(SyncObjectAccess.EVENT_MODIFY_STATE, false,
String.Format("MySQLShutdown{0}", pid.ToString()));

if ( chk != null ) return true;

return false;
}
catch (Exception) { return false;}
}

public static void StartMysql(String path, String aargs)
{
// All ok. Simply spawn a process
}

最佳答案

您必须编写某种循环代码。你启动 mysql 进程,当你在它之后立即检查时,进程仍然不存在,你返回 false。

尝试这样的事情:

// if not running, I start it
MysqlController.StartMysql(Constants.dbexe,Constants.dbopts);
// wait 10 seconds max.
int timeout = 10;
bool mySqlIsRunning = false;

while(!MysqlController.CheckMysqlIsRunning(Constants.dbpidfile)) {
// wait a while
Thread.Sleep(1000);
if (timeout-- == 0) {
// timeout error
// show message to user ...
}
}

// here mysql is running or your timeout is expired.

关于c# - 如何解决 C# Premature Object Dispose,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13308029/

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