2013-04-10 4 views
-1

My Excel AddIn은 NetOffice, ExcelDNA, C# 로 작성되었으며 데이터를 가져 오기 위해 웹 서비스를 호출합니다. 많은 양의 데이터를 가져 오는 데 약간의 시간이 걸립니다. 데이터 가져 오기 프로세스 중에 네트워크 연결이 끊어지면 Excel이 중지되고 "응답 없음"과 같이 표시됩니다. 이제 Excel을 닫으려고하면 닫기 또는 디버그를 요청할 것입니다. 나는 그것을 단순히 닫는다. 그런 다음 Excel을 다시 시작하면 성가신 메시지 상자에 "Excel에 'commodity add-in'추가 기능에 심각한 문제가 발생했습니다.이 메시지가 여러 번 나타난 경우이 추가 기능을 사용하지 않도록 설정해야합니다. 업데이트를 사용할 수 있는지 확인하십시오.이 추가 기능을 사용하지 않도록 설정 하시겠습니까? "네트워크 연결이 끊어지면 Excel이 손상됩니다.

적절하게 연결이 끊긴 상황을 어떻게 처리해야합니까? 감사합니다.

+1

시도/웹 요청을 잡을 수있어. – scottheckel

+0

가져 오기가 Excel에서 직접 수행되고 있습니까? 추가 기능에서 중간 데이터 저장소를 만드는 방법. 그것을 가져오고 끝내면 그것을 가져와 Excel로 만듭니다. –

답변

2

가능한 경우 웹 서비스 호출을 비동기 적으로 수행하십시오. 대부분의 WS는 비동기 버전과 비동기 버전의 호출을 제공합니다.

이것이 가능하지 않은 경우 별도의 스레드 내에서 웹 서비스 데이터 가져 오기를 실행하는 것이 좋습니다.

두 시나리오 모두 특정 기간이 지나면 작업을 종료하는 배관 코드를 넣어야하며, 일부는 사용자에게 모두 잘 작동하지 않는다는 것을 알리는 수단 일 수도 있습니다.

+3

사실 Excel-DNA에서 새로운 비동기 UDF 지원이 필요로하는 것처럼 들립니다. – Govert

+0

@Govert는 다음과 같은 예를 게시 할 수 있습니다. –

+0

Excel-DNA 배포에서 Reactive Extensions (RxExcel) 및 네이티브 F # 비동기 UDF를 사용하여 .NET 4 Tasks를 사용하는 간단한 비동기 함수의 예가 있습니다. https://exceldna.codeplex.com 및 http://excel-dna.net을 참조하십시오. – Govert

1

은 "엑셀은 'XXX 추가 기능'을 추가 기능에 심각한 문제가 발생했습니다.이 메시지를 여러 번, 당신은 사용하지 않아야 본 경우이 추가 기능과 업데이트가 있는지 확인 사용 가능합니다. 에이 기능을 사용하지 않도록 설정 하시겠습니까? "

처리되지 않은 예외가 발생할 때이 문제가 발생합니다. Excel에서 다음에 시작할 추가 기능을 사용하지 않도록 설정하라는 메시지가 나타납니다. 이로 인해 사용자는 this to fix it과 같은 게시물로 이어질 수 있습니다.

관리자가 아닌 환경에서 Citrix를 사용하는 클라이언트를 지원해야하는 경우 문제가 더욱 심해집니다. 추가 기능을 제거하려는 Excel의 문제를 해결하려면 전역 예외 처리기를 추가해야합니다. 따라서 예외가 Excel로 다시 참조되지 않으므로 사용자에게 추가 기능을 사용하지 않도록 설정하지 않아야합니다.

public YouAddInCtrl() 
{ 
    InitializeComponent(); 
    // Add the event handler for handling UI thread exceptions to the event. 
    System.Windows.Forms.Application.ThreadException += ApplicationThreadException; 
    // Add the event handler for handling non-UI thread exceptions to the event. 
    AppDomain.CurrentDomain.UnhandledException += ApplicationUnhandledException; 
} 

private void ApplicationThreadException(object sender, ThreadExceptionEventArgs e) 
{ 
    addInManager.TopLevelExceptionHandler(e.Exception); 
} 

private void ApplicationUnhandledException(object sender, UnhandledExceptionEventArgs e) 
{ 
    addInManager.TopLevelExceptionHandler((Exception)e.ExceptionObject); 
} 


// Any exceptions returned to Excel will cause the Addin to be disabled 
// So we must swallow them here. 
internal void TopLevelExceptionHandler(Exception ex) 
{ 
    var e = new NotificationEventArgs(NotificationEventArgs.NotificationEnum.TopLevelException); 
    if (NotifyEventTopLevelException != null) 
    { 
     if (NotifyEventTopLevelException(ex,e)) 
     { 
      System.Diagnostics.Process.Start("mailto:[email protected]%3e?subject=XYZ%202%20PROD%20Environment%20Problem&body=Hi,%0A%0AIssue:%0A%0ASteps%20to%20Reproduce:"); 
     } 
    } 

    LogExceptions(ex); 
} 

나는 또한 예를 들어, 다른 스레드에서 WebService에 요청을 실행하는 것이 제안 :

여기
BackgroundWorker1.WorkerReportsProgress = true; 
BackgroundWorker1.WorkerSupportsCancellation = true; 
BackgroundWorker1.DoWork += DoWorkExecuteQuery; 
BackgroundWorker1.RunWorkerCompleted += RunWorkerCompletedExecuteQuery; 


private bool QueryData() 
{ 
    var thinkProgBar = new ThinkingProgressBar(); 
    thinkProgBar.ShowCancelLink(true); 
    thinkProgBar.SetThinkingBar(true); 
    BackgroundWorker1.RunWorkerAsync(thinkProgBar); 
    thinkProgBar.ShowDialog(); 
    if (thinkProgBar.Tag != null && thinkProgBar.Tag.ToString() == "Cancelled") 
    { 
     CancelGetDataByFilters(); 
     thinkProgBar.SetThinkingBar(false); 
     return false; 
    } 
    thinkProgBar.SetThinkingBar(false); 
    return true; 
} 

private void DoWorkExecuteQuery(object sender, DoWorkEventArgs e) 
{ 
    dtQueryData = null; 
    e.Result = e.Argument; 
    ((ThinkingProgressBar)e.Result).SetThinkingBar(true); 
    dtQueryData = WEBSERVICE.GetData(); //CALL YOUR WEBSERVICE HERE 
} 

private void RunWorkerCompletedExecuteQuery(object sender, RunWorkerCompletedEventArgs e) 
{ 
    var dlg = e.Result as ThinkingProgressBar; 
    if (dlg != null) { 
     ((ThinkingProgressBar)e.Result).SetThinkingBar(false); 
     dlg.Close(); 
    } 
} 

는 ThinkingProgress 줄 수 있습니다 :

public partial class ThinkingProgressBar : Form 
{ 
    private System.DateTime startTime = DateTime.Now; 
    public ThinkingProgressBar() 
    { 
     InitializeComponent(); 
    } 

    private void lblClose_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) 
    { 
     this.Tag = "Cancelled"; 
     this.Hide(); 
    } 
    public void ShowCancelLink(bool show) 
    { 
     lblClose.Visible = show; 
    } 

    public void SetThinkingBar(bool on) 
    { 
     if (on) 
     { 
      lblTime.Text = "0:00:00"; 
      startTime = DateTime.Now; 
      timer1.Enabled = true; 
      timer1.Start(); 
     } 
     else 
     { 
      timer1.Enabled = false; 
      timer1.Stop(); 
     } 
    } 

    private void timer1_Tick(object sender, EventArgs e) 
    { 
     var diff = new TimeSpan(); 
     diff = DateTime.Now.Subtract(startTime); 
     lblTime.Text = diff.Hours + ":" + diff.Minutes.ToString("00") + ":" + diff.Seconds.ToString("00"); 
     lblTime.Invalidate(); 
    } 
} 
관련 문제