。网络代码突然跳水
我参与的一个项目已经运行了几个月,非常稳定,但现在突然间歇性问题出了问题......你不喜欢那种声音吗?无论如何,C#代码从数据库中获取输入,为销售和制造部门做一些事情,然后启动AutoCAD和LISP程序来创建图形。它每天创建50到200张图纸。目前为止,一切都好。这个东西是完全自动化的,所以不需要或允许人机交互。现在发生的事情是,每天大约运行3-4次,AutoCAD在开始绘制过程之前停滞不前。在调试中,我已经检查过了。当我检查错误消息时,我得到这个:
ERROR: System.Runtime.InteropServices.COMException (0x8001010A): The message filter indicated that the application is busy. (Exception from HRESULT: 0x8001010A (RPC_E_SERVERCALL_RETRYLATER))
at AutoCAD.IAcadDocument.SendCommand(String Command)
at BOM_CALCS.LaunchAutoCAD.StartAutoCAD() in C:\Engineering\Calculations\BOM\BOM_CALCS\LaunchAutoCAD.cs:line 55
at BOM_CALCS.Program.Main(String[] args) in C:\Engineering\Calculations\BOM\BOM_CALCS\Program.cs:line 102
不幸的是,每天3-4次现在已经增长到每天10-12次。对此没有太多帮助,因为它是间歇性的。而所有其他时间都完美运行的相同代码击中了这一点,足以引起关注。
**** Hidden Message ***** 此消息:
消息筛选器指示应用程序正忙。
可能提示应用程序一次被多个请求破坏,此链接可能会有所帮助。
https://msdn.microsoft.com/en-us/library/ms228772.aspx
嗯 谢谢,但我很确定这不是问题所在。有几次我一次看了三(3)次。它几乎总是每5-10分钟运行一次。有时它比较重,但通常足够安静,不会同时跑步。我看到它失败的次数是当它只运行一个实例时。真希望这么简单。这是一个很难破解的问题。
嗨,比尔
,我不玩Com,但是:
什么是客户端版本
什么是开发API版本
您尝试发送的命令是什么。
第 55 行及之前失败的代码是什么。
您是否在早期版本的客户端上开发了此应用程序。
应用是否在与客户端相同的计算机上运行。
单个用户还是多个用户 ? 谢谢kdub。明天当我回到办公室的时候,我将能够以明确的观点来回答。棘手的是,它已经连续几天、几周完美运行。最近雇佣了一个非常有经验的开发人员,他将RPC服务引入其中。这是我开始注意到这个问题的时候。然而,在他看来,我只能说这是一个间歇性的问题。也就是说,每天100次跑步中,只有10次会有问题。他在开发方面有丰富的经验,我的意思是这个家伙实际上发明了OOP,他认为问题是COM对象没有关闭,但是到目前为止我还没有看到。从明天早上开始,我会和他一起做更多的工作。
这也是我的第一个猜测,但是,我还没有发明任何东西
这是点对点论坛的问题之一。
关键信息不会在第一篇文章中提供。
我的问题不应该问。 再次感谢大家的耐心等待。现在让我看看我是否可以阐明问题,因为这已经成为我必须解决的主要错误。
这是一个完全自动化的项目,不允许任何用户与它进行交互。唯一的例外是我是主要开发人员,我只在它停滞不前时才搞砸它。基本上,Apache+php(XAMPP)监听来自网络的请求。收到一个后,我的项目的主要.exe从php程序启动。所有这些都运作良好。最终,调用 AutoCAD 以生成图形。 因此,我用来启动AutoCAD的代码是:
using System;
using AutoCAD;
namespace AHD_BOM_CALCS
{
class LaunchAutoCAD
{
private static IAcadApplication vAcadApp = null;
private static IAcadDocument vAcadDoc = null;
// CHANGE THIS TO AutoCAD.Application.20 FOR ACAD 2015/16
private static string vAcadID = "AutoCAD.Application.20";
private static string LispPath = @"C:/Engineering/04VLISP/ANGLE/Bomber/";
private static string DwgPath = @"C:\Engineering\09Automated Drawings\";
public static void StartAutoCAD()
{
try
{
// Check for instance of AutoCAD
vAcadApp = (IAcadApplication)System.Runtime.InteropServices.Marshal.GetActiveObject(vAcadID);
}
catch (Exception) // If none found start a new instance of AutoCAD
{
System.Type AcadProg = System.Type.GetTypeFromProgID(vAcadID);
vAcadApp = (IAcadApplication)System.Activator.CreateInstance(AcadProg);
}
string titleblock = "Template1(Automated).dwg";
if (vAcadApp != null)
{
vAcadApp.Visible = true;
vAcadDoc = vAcadApp.Documents.Open(DwgPath + titleblock, true);
string LispName = "Bomber.lsp";
vAcadDoc.SendCommand("(load \"" + LispPath + LispName + "\" \"The load failed\") ");
vAcadDoc.SendCommand(LISPVariables.PrepareAcadCmd() + " ");
vAcadDoc.SendCommand("(setvar \"osmode\" 703) ");
vAcadDoc.SendCommand("(setvar \"cmdecho\" 1) ");
vAcadDoc.SendCommand("(setvar \"pickbox\" 5) ");
vAcadDoc.SendCommand("(setq svPath \"C:/0/Misc/BomberDevDwgs/\") ");
vAcadDoc.SendCommand("(setq *erp 1) ");
vAcadDoc.SendCommand("DrawitNow ");
}
else
{
Console.WriteLine("ERROR: The drawing file is missing.");
Console.ReadKey();
}
}
}
}
在运行此类之前,C#项目会执行一堆计算并将这些结果写入Oracle数据库。所有这些部分都运行良好,从来都不是问题。只有当LaunchAutoCAD类到达SendCommand行时,事情才会向南发展。而且它似乎永远不会在同一条线上失败。有时没有一个命令去,有时其中2或3个去,但后来它停滞了,从来没有得到最后一个命令,即启动LISP代码的“Drawit”。图形随即生成并保存到服务器。它昼夜不停地运行,监听请求。在每天的100多次跑步中,大约有5-10次停滞不前。我已经检查了运行此项目的工作站,并且似乎没有像任务管理器中卡住的acad.exe进程或其他任何东西。我已经冷启动它,看看这是否会清除蜘蛛网,但这没有帮助。正如老话所说,如果可行,我准备在火花塞上小便。 由于它在SendCommand()区域跳闸,您可以尝试删除一些命令。这三个真的需要在代码的C#部分中设置吗?在lisp例程的开头运行它们会非常简单和干净,vAcadDoc.SendCommand("(setvar\"osmode\"703) ");。
vAcadDoc.SendCommand("(setvar\"cmdecho\"1) ");。
vAcadDoc.SendCommand("(setvar\"Pickbox\"5) ");(if (not (= (getvar "osmode") 703)) (setvar "osmode" 703))
(if (not (= (getvar "cmdecho") 1)) (setvar "cmdecho" 1))
(if (not (= (getvar "pickbox") 5)) (setvar "pickbox" 5))。
https://msdn.microsoft.com/en-us/library/ms228772.aspx
页:
[1]
2