我一直在观察,即使进程仍在运行,Process.HasExited有时也会返回true.
我的代码在下面启动一个名为"testprogram.exe"的进程,然后等待它退出.问题是有时我会抛出异常; 似乎即使HasExited返回true过程本身在系统中仍然存在 - 这怎么可能?
我的程序在它终止之前写入日志文件,因此我需要在读取之前绝对确定该日志文件存在(也就是进程已终止/完成).不断检查它的存在不是一种选择.
// Create new process object
process = new Process();
// Setup event handlers
process.EnableRaisingEvents = true;
process.OutputDataReceived += OutputDataReceivedEvent;
process.ErrorDataReceived += ErrorDataReceivedEvent;
process.Exited += ProgramExitedEvent;
// Setup start info
ProcessStartInfo psi = new ProcessStartInfo
{
FileName = ExePath,
// Must be false to redirect IO
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true,
Arguments = arguments
};
process.StartInfo = psi;
// Start the program
process.Start(); …Run Code Online (Sandbox Code Playgroud) 我有一个包含url的表和一个表示其参数的字符串.问题是我想要一个url和一个参数字符串作为表的唯一约束 - 也就是说没有条目可以具有相同的url和参数字符串.参数字符串可以是任意长度(比800bytes长左右这是一个MySQL的关键最大长度,所以因为它抛出一个错误,我不能用独有的(URL,则params)...).
我考虑使用触发器来执行此操作,但如果触发器发现插入即将插入重复条目,如何抛出异常/引发错误?我想我想抛出MySqlException,就像MySql一样,重复主键等,所以我可以用我的C#代码捕获它.
我在触发器中有两个部分需要帮助:...中止抛出异常到C#...如何向C#抛出异常等?...允许插入... - 如果没有重复输入,我如何才允许插入?
继承人触发代码:
CREATE TRIGGER urls_check_duplicates
BEFORE INSERT ON urls
FOR EACH ROW
BEGIN
DECLARE num_rows INTEGER;
SELECT COUNT(*)
INTO num_rows
FROM urls
WHERE url = NEW.url AND params = NEW.params;
IF num_rows > 0 THEN
... ABORT/throw exception to C# ...
ELSE
... Allow insert ...
END
Run Code Online (Sandbox Code Playgroud) 我需要使用一些东西来协调我的系统与几个使用不同操作系统的不同机器上运行的消费者/生产者.我一直在研究使用MySql来做这件事,但这看起来非常困难.
我的要求很简单:我希望能够随时添加或删除消费者/生产者,因此他们不应该完全依赖彼此.当然,数据库会很好地将两者分开.
我一直在寻找MySql的Q4M消息队列插件,但它看起来很复杂.
我真的需要一些关于如何最好地构建我的系统的输入.
可能重复:
如何将ctrl + c发送到c#中的进程?
我无法弄清楚如何模拟发送Ctrl+ C外部程序.当我通过CMD手动运行该程序,当我按下Ctrl+ c将中止,并问我是否要保存它已完全关闭之前.我试图通过C#来模拟它,但它似乎不起作用.
这就是我现在正在做的事情:
// Create new process object
process = new Process();
// Setup event handlers
process.EnableRaisingEvents = true;
process.OutputDataReceived += OutputDataReceivedEvent;
process.ErrorDataReceived += ErrorDataReceivedEvent;
process.Exited += ProgramExitedEvent;
// Setup start info
ProcessStartInfo psi = new ProcessStartInfo
{
FileName = ExePath,
UseShellExecute = false, // Must be false to redirect IO
RedirectStandardOutput = false,
RedirectStandardError = false,
RedirectStandardInput = true,
Arguments = arguments
};
process.StartInfo = psi;
// Start …Run Code Online (Sandbox Code Playgroud) 我有一个简单的问题:我想构建一个与HTML中的表单匹配的正则表达式,但前提是表单有任何输入标记.例:
应匹配以下内容(忽略属性):
..
<form>
..
<input/>
..
</form>
..
Run Code Online (Sandbox Code Playgroud)
但以下不应该(忽略属性):
..
<form>
..
</form>
..
Run Code Online (Sandbox Code Playgroud)
我已经尝试了从外观到捕获组的所有内容,但它很快变得复杂.我想相信有一个简单的正则表达式来捕捉问题.请注意,正则表达式必须根据HTML代码对开始和结束标记进行配对,这意味着以下操作不起作用:
<form>.+<input/>.+</form>
Run Code Online (Sandbox Code Playgroud)
因为它错误匹配如下:
..
<form> <--- This is wrongly matched as the opening tag
..
</form>
<form> <-- This is the correct opening tag of the correct form
..
<input/>
..
</form> <--- This is matched as the closing tag
..
Run Code Online (Sandbox Code Playgroud)
编辑:
我已经制作了符合我想要的RegEx; 我的问题是现在该怎么做,但如何做到简单/优雅.对我来说,这根本不简单或优雅:
<form>
(.(?<!</form>))+
<input/>
(.(?<!</form>))+
</form>
Run Code Online (Sandbox Code Playgroud) 在服务器和客户端之间传输尽可能少的数据至关重要.因此我想到了使用mysql的Compress()函数.为了获得最大压缩,我还想在一个大字符串(或MySql允许的几个最大长度)中连接我的所有结果,以允许压缩类似的结果,然后压缩这些/那个字符串.
第一个问题(连接mysql结果):
SELECT name,age
FROM users
Run Code Online (Sandbox Code Playgroud)
返回10个结果.我想在表格上的一个条纹中连接所有这些结果:名称,年龄,姓名,年龄,姓名,年龄......等等.这可能吗?
第二个问题(压缩上面的结果)
当我按照上面的方法构建连接字符串时,我想压缩它.如果我做:
SELECT COMPRESS('myname');
Run Code Online (Sandbox Code Playgroud)
然后它只是给我输出字符' - ' - 有时它甚至返回不可打印的字符.如何让COMPRESS()返回一个压缩的可打印字符串,我可以用ex ASCII编码进行转换?