MickD 发表于 2016-3-11 17:25:35

。网络代码突然跳水

我参与的一个项目已经运行了几个月,非常稳定,但现在突然间歇性问题出了问题......你不喜欢那种声音吗?无论如何,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 *****

kdub 发表于 2016-3-11 17:58:53

此消息:
消息筛选器指示应用程序正忙。
可能提示应用程序一次被多个请求破坏,此链接可能会有所帮助。
https://msdn.microsoft.com/en-us/library/ms228772.aspx

kdub 发表于 2016-3-11 20:59:23

谢谢,但我很确定这不是问题所在。有几次我一次看了三(3)次。它几乎总是每5-10分钟运行一次。有时它比较重,但通常足够安静,不会同时跑步。我看到它失败的次数是当它只运行一个实例时。真希望这么简单。这是一个很难破解的问题。

Master_Shake 发表于 2016-3-11 23:04:07


嗨,比尔
,我不玩Com,但是:
什么是客户端版本
什么是开发API版本
您尝试发送的命令是什么。
第 55 行及之前失败的代码是什么。
您是否在早期版本的客户端上开发了此应用程序。
应用是否在与客户端相同的计算机上运行。
单个用户还是多个用户 ?

Tharwat 发表于 2016-3-13 11:50:59

谢谢kdub。明天当我回到办公室的时候,我将能够以明确的观点来回答。棘手的是,它已经连续几天、几周完美运行。最近雇佣了一个非常有经验的开发人员,他将RPC服务引入其中。这是我开始注意到这个问题的时候。然而,在他看来,我只能说这是一个间歇性的问题。也就是说,每天100次跑步中,只有10次会有问题。他在开发方面有丰富的经验,我的意思是这个家伙实际上发明了OOP,他认为问题是COM对象没有关闭,但是到目前为止我还没有看到。从明天早上开始,我会和他一起做更多的工作。

Master_Shake 发表于 2016-3-13 19:56:02


这也是我的第一个猜测,但是,我还没有发明任何东西

Tharwat 发表于 2016-3-13 22:41:51


这是点对点论坛的问题之一。
关键信息不会在第一篇文章中提供。
我的问题不应该问。

dgorsman 发表于 2016-3-16 11:33:07

再次感谢大家的耐心等待。现在让我看看我是否可以阐明问题,因为这已经成为我必须解决的主要错误。
这是一个完全自动化的项目,不允许任何用户与它进行交互。唯一的例外是我是主要开发人员,我只在它停滞不前时才搞砸它。基本上,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进程或其他任何东西。我已经冷启动它,看看这是否会清除蜘蛛网,但这没有帮助。正如老话所说,如果可行,我准备在火花塞上小便。

Tharwat 发表于 2016-3-16 12:07:28

由于它在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))。

Master_Shake 发表于 2016-3-16 12:29:03

https://msdn.microsoft.com/en-us/library/ms228772.aspx
页: [1] 2
查看完整版本: 。网络代码突然跳水