2014-10-24 6 views
-1

저는 일주일 동안이 작업을하고 있으며 StackOverflow를 광범위하게 사용했지만이 문제를 해결할 수는 없습니다.C#에서 긴 COM 작업을 실행 중일 때 포이즌 메시지를 제거 할 수 없습니다.

저는 오토 데스크 제품에서 C#으로 플러그인을 작성 중이며 마샬과 함께 다른 3D 응용 프로그램에 연결되어 있습니다. 과거에 문제없이 다른 플러그인 수십개에 대해이 작업을 수행했습니다.

이 프로젝트는 고유합니다. 다른 3D 응용 프로그램에서 저는 대형 모델에서 장기 실행 작업 (파일 내보내기)을 실행하고 있습니다. 때때로 1-60 분이 걸립니다.

"응용 프로그램이 응답하지 않기 때문에이 작업을 완료 할 수 없습니다."전환 "을 선택하고 ..."기술적으로 클라이언트가 "재 시도"를 클릭 할 때까지 기다릴 수 있습니다 응용 프로그램,하지만 그건 바람직하지 않습니다.

원래 DoEvents 유형을 넣을 것이라고 생각했지만 내보내기가 완료 될 때까지 기다릴 것이지만 내보내기 서브가 실행되는 동안 포이즌 메시지가 나타납니다 (포이즌 메시지가있는 첫 번째 발생이므로, m 학습). 그런 다음 백그라운드 스레드에서이 내보내기 작업을 실행하여 ThreadPool 및 Thread 작업을 테스트했습니다. 그러나 서비스를 "시작"할 수는 있지만 다른 3D 응용 프로그램에서 모델을 절대로 내보낼 수는 없습니다. 그것은 단지 영원히 계속됩니다. (해당 하위 문제에 대한 해결책을 찾지 않아서 원래 게시물의 오류 메시지를 제거 했으므로 아래에서 설명 할 내용을 참조하십시오.)

마지막으로 NetMsmqBinding (나는 이것에 대해 아무것도 모른다. 그러나 그것을 배우려고 노력한다.) 그것이 허용 된 재시도 횟수를 더 큰 숫자로 설정할 것을 희망한다.

 System.TimeSpan TS = new System.TimeSpan(0, 30, 10); 
     System.TimeSpan TB = new System.TimeSpan(10, 0, 0); 
     NetMsmqBinding NMB = new NetMsmqBinding(); 
     NMB.MaxRetryCycles = 1000; 
     NMB.ReceiveRetryCount = 1000; 
     NMB.RetryCycleDelay = TS; 
     NMB.OpenTimeout = TB; 

그러나, 아무리 내가, 내가 항상 같은 시간에 "재시도"메시지가 내 NetMsmqBinding 값을 변경할 것. 나는 정확하게 쓰지 말아야한다. 다른 예에서는 이러한 값이 포함 된 xml 파일을 발견했으며 그 XML이 무엇인지 알지 못합니다. 내가 정말로 알고 싶지도 않습니다. 차라리 다른 XML 파일을 처리하기보다는 플러그인에서 실행하기 때문입니다.

가상의 (많은 console.write BS) 가정에서이 문제를 처리하는 방법에 대한 많은 예제를 찾고 있지만 실제로 장기 실행 COM 프로세스가 주 C# 유틸리티를 방해하는 구체적인 예는 없습니다.

재시도 빈도와주기를 오래 유지하는 방법을 알고 싶습니다. 포이즌 메시지가 표시되지 않도록해야합니다. 어떻게해야합니까? 난 더 이상이 작업 할 시간이 없었기 때문에

namespace Testing_V0 
{ 
    [PluginAttribute("Testing_V0R1", "ADSK", ToolTip = "Testing the plugin", DisplayName = "Testing the plugin")] 
    [AddInPluginAttribute(AddInLocation.AddIn)] 
    public class MyPlugin : AddInPlugin 
    { 
     public override int Execute(params string[] parameters) 
     { 
     System.TimeSpan TS = new System.TimeSpan(0, 30, 10); 
     System.TimeSpan TB = new System.TimeSpan(10, 0, 0); 
     NetMsmqBinding NMB = new NetMsmqBinding(); 
     NMB.MaxRetryCycles = 1000; 
     NMB.ReceiveRetryCount = 1000; 
     NMB.RetryCycleDelay = TS; 
     NMB.OpenTimeout = TB; 

     //NMB.ReceiveErrorHandling = ReceiveErrorHandling.Drop; 

    //Do the Export process here 
    } 
    } 
} 
+1

"포이즌 메시지"가 아니며 디버거의 MDA 알림입니다. ContextSwitchDeadlock 관리 디버거 길잡이는 메서드 호출이 60 초 동안 완료되지 않을 때 가능한 교착 상태를 감지하도록 설계되었습니다. 당신은 이미 그것을 일으킨 원인을 알고, 프로그램을 의도적으로 멈추게 만들었습니다. Debug + Exceptions에서 "Managed Debugging Exceptions"노드를 확장하십시오. 경고를 취소하면 다시 볼 필요가 없습니다. –

+0

그 정보를 제공해 주셔서 감사합니다.하지만 게시물 끝에 netmsmqbinding 문제에 더 관심이 있습니다. 나는 이것이 당신이 언급 한 게시물의 사본이라고 생각하지 않습니다. –

+0

두 가지 질문을하지 마십시오. 두 번째 질문을 다시 할 수 있습니다. –

답변

-1

, 나는 내가 이것을 해결하는 방법을 설명합니다 : 여기

더 많은 코드가 일부 컨텍스트를 제공합니다. 아마도이 문제를 해결하는 것은 바람직하지 않지만 이점이 있습니다.

몇 달 전 비 관련 프로젝트에서 동일한 파일 형식을 내보낼 때와 비슷한 응용 프로그램을 콘솔 응용 프로그램에서 만들었습니다. AutoDesk 제품의 dll에서 발생하는 이러한 문제와 같은 콘솔 응용 프로그램에는 문제가 없습니다.

콘솔 앱 내보내기에서 기억하고있는 것을 사용하여 파일 내보내기 만 수행 한 새로운 소형 콘솔 앱 exe를 만들었습니다. 그런 다음 상위 dll에서 System.IO.Process.Start (file.exe, "arguments") 명령을 사용하여 실행 파일을 트리거합니다.

이것은 팝업 메시지를 없애기위한 매우 둥근 방법이지만 몇 가지 장점이 있습니다. 실행 파일은 C# DLL이 계속 실행되는 동안 내보내기를 실행합니다. 이렇게하면 파일이 디렉토리에 나타날 때까지 간단한 file-exists 루프를 실행 한 다음 계속 진행할 수 있습니다. 나는 C# DLL UI에 진행 카운터를 놓았고, 클라이언트가 실행되는 동안 클라이언트에게 안정적인 읽기를 제공한다.

내가 말했듯이, 이것은 이상적은 아니지만, 이것은 현재 나에게 적합합니다.

+0

다운 - 유권자에게 더 나은 해결책을 안다면, 꼭 대답을 게시하십시오. 해결책을 제시 할 수 없을 때 투표하기가 쉽습니다. –

+0

나는 아직도 이것을하기위한 더 좋은 방법을 찾고있다. 다운 유권자가 해결책을 게시 할 수 있습니까? –

+0

netmsmqbinding 매개 변수를 수정하는 데 아무 것도 얻을 수 없습니다. 누구든지 나를 도울 수 있습니까? –