2014-07-25 4 views
2

Excel-DNA를 사용하여 비동기 Excel 함수 호출을 실행하고 있습니다. 내 Excel 함수는 통신 인터페이스를 통해 R을 호출합니다.대기열 비동기 함수 호출

나는 comm 인터페이스를 비동기 적으로 호출 할 수 없으며 동 기적으로 호출해야한다는 것을 알고있다. R 측의 내부 상태가이 프로세스를 망칠 수 있으므로 엑셀 기능이 실행되는시기를 명시 적으로 제어하고 싶습니다.

대기열을 만들고 한 번에 하나씩 Excel 기능 만 실행할 수 있습니다. 즉, 준비가 완료되는 즉시 다른 기능을 실행하기 시작합니다.

그리고 엑셀 세션이 정지되는 것을 멈추기 때문에 엑셀 함수를 비동기 적으로 실행하고 싶습니다. 나는 이것을함으로써 어떤 속도도 얻지 못한다는 것을 이해하지만, 사용자에게는 "느리다"고 느낀다.

여기 내 예제 코드입니다 :

[ExcelFunction] 
    public static object AsyncRCallTest(int a1, int a2) 
    { 
     return ExcelAsyncUtil.Run("ASyncRCallTest", new object[] { a1, a2 }, delegate 
     { 
      try 
      { 
       var a = RConnection.Evaluate(a1); 
       var b = RConnection.Evaluate(a2); 
       return a + b; 
      } 
      catch (Exception err) 
      { 
       return err.Message; 
      } 
     }); 
    } 

답변

1

[MethodImpl (MethodImplOptions.Synchronized가)] (아래 예제 코드 참조) 트릭을 할 것 같았다. 누군가가 이것을 확인할 수 있다면 기쁠 것입니다.

[ExcelFunction] 
    public static object AsyncRCallTest(int a1, int a2) 
    { 
     return ExcelAsyncUtil.Run("AsyncRCallTest", new object[] { a1, a2 }, delegate 
     { 
      return SyncRCallTest(a1, a2); 
     }); 
    } 


    [MethodImpl(MethodImplOptions.Synchronized)] 
    public static object SyncRCallTest(int a1, int a2) 
    { 

     try 
     { 
      var a = RConnection.Evaluate(a1); 
      var b = RConnection.Evaluate(a2); 
      return a + b; 
     } 
     catch (Exception err) 
     { 
      return err.Message; 
     } 

    }