如何避免死锁条件

时间:2010-05-19 08:59:00

标签: c# deadlock conditional-statements

我尝试编写像编译器这样的程序。在这种情况下,我必须模拟这些SQLPL代码(例如,这可能只是)。例如,在命令提示符中,我想要执行以下操作:

c:\> sqlplus
 ....
Enter User-Name:(here we must enter username) xxxx
Enter password:(same up)yyyyy
...
sql>(now I want to send my sql command to shell)prompt "rima";
"rima"  [<-output]
sql> prompt "xxxx"
sql> exit
很简单。 我尝试使用这段代码:

ProcessStartInfo psi = new ProcessStartInfo(
@"sqlplus");
psi.UseShellExecute = false;
psi.CreateNoWindow = true;
psi.RedirectStandardInput = true;
psi.RedirectStandardOutput = true;
//psi.RedirectStandardError = true;
Process process = new Process();
process.StartInfo = psi;
bool started = process.Start();
if (started)
{
process.StandardInput.WriteLine("user/password");
process.StandardInput.Flush();
string ret = process.StandardOutput.ReadLine(); // <-- stalls here
System.Console.WriteLine("sqlplus says :" + ret + "\".");
}

我发现它来自here,但好像你读过这段代码有问题! DEADLOCK条件问题! 这是我第二次问我的问题,每当我的知识增长,但我终于无法得到如何解决我的问题!!!

所以我亲切地亲你的手,请帮助我,这个过程对我来说并不清楚。任何人都可以给我一个处理我的问题的代码?我已经查看了所有代码,我也尝试使用ProcessRunner,在我上一篇文章中有人提供给我,但我也不能使用它,我收到错误。

我希望通过第一个例子找出我想要的东西,并解决第二个代码问题...... 我使用C#实现,我的数据库是Oracle
我不希望每次连接都关闭sqlplus,因为再次登录需要时间。

1 个答案:

答案 0 :(得分:0)

在我看来,你的方法不适用于这个例子。你写道:

  

输入用户名:(此处我们必须输入用户名)xxxx
  输入密码:(同上)yyyyy

所以看起来好像没有涉及换行符。由于您要连接 StandardOutput 缓冲,只有在出现换行符或直接调用 flush()时才会刷新它。情况可能并非如此(应该在 sqlplus 中发生)。

因此,只要您无法更改 sqlplus 并在其中插入flush或换行符,同步读取将根本无法帮助您。尝试进行异步通信,例如:

process.OutputDataReceived += OnOutputDataReceived;
process.Start();
process.BeginOutputReadLine();
// ... more missing code here ...

但这是一种复杂得多的方法......