2013-04-10 167 views
-1

我的Excel AddIn是使用NetOffice,ExcelDNA,C#編寫的 它調用Web服務來獲取數據。獲取大量數據需要一段時間。 在數據提取過程中,如果網絡連接丟失,則Excel將掛起,顯示爲「未響應」。現在,如果我嘗試關閉Excel,它會要求您關閉或調試。我只是關閉它。 然後,當我重新啓動Excel時,出現一個令人討厭的消息框出現「Excel遇到了」商品插件「加載項的嚴重問題。如果您多次看到此消息,則應該禁用此加載項,並檢查是否有更新可用。是否要禁用此加載項?「。丟失的網絡連接導致Excel崩潰

我不知道如何處理連接丟失時的情況?謝謝

+1

的try/catch您的網絡請求。 – scottheckel 2013-04-10 22:12:51

+0

提取是直接進行到Excel?如何在插件中創建一些中間數據存儲。取出並完成後,將其取出以取得優異成績。 – 2013-04-10 22:13:38

回答

2

如果可能,請異步進行Web服務調用。大多數WS將提供您可以創建的異步版本和非異步版本的調用。

如果這不可行,請考慮在單獨的線程中執行Web服務數據提取。

在這兩種情況下,您應該在一段時間後放置一些管道代碼以殺死作業,並且可能會通知用戶並非一切正常。

+3

事實上 - 這聽起來像Excel-DNA中的新異步UDF支持是人們所需要的。 – Govert 2013-04-10 22:54:18

+0

@Govert請你張貼一個例子:) – 2013-04-10 22:58:51

+0

有一些簡單的異步函數的例子,使用.NET 4任務,在Excel-DNA發行版中使用Reactive Extensions(RxExcel)和原生F#異步UDF。請參閱https://exceldna.codeplex.com和http://excel-dna.net。 – Govert 2013-04-11 09:25:45

1

「Excel中經歷了嚴重的問題,用‘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(); 
    } 
}