2012-01-21 21 views
12

Tôi gặp vấn đề với chương trình My WinApp Form có chứa tab Control với WebBrowser control DLL (GeckoFX).WinApp Form Crash Không có bất kỳ lỗi hoặc ngoại lệ nào .Net

Ứng dụng của tôi trong khi chạy gần mà không có bất kỳ ngoại lệ hoặc bất kỳ điều gì. Nó có thể xảy ra sau vài phút hoặc tối đa sau 10 phút. Trong phòng thu trực quan, tôi thấy ứng dụng chấm dứt bằng mã 0. Bất kỳ điều gì.

Trong program.cs tôi bắt tất cả excpetion unhandled này

` // Add the event handler for handling UI thread exceptions to the event. 
       Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(UIThreadException); 

    // Set the unhandled exception mode to force all Windows Forms errors to go through 
    // our handler. 
        Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); 

// Add the event handler for handling non-UI thread exceptions to the event. 
       AppDomain.CurrentDomain.UnhandledException += 
        new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);` 

Tôi đã kiểm tra trong Windows Event logger cho bất kỳ lỗi nhưng nó sạch. Cũng giống như Chương trình được chấm dứt tốt. Tôi không biết nếu đó là lỗi Gecko DLL nhưng tôi không nghĩ vậy.

Tôi sử dụng httpWebRequest để tải xuống danh sách chứa một số URL.

Sau đó, tôi sử dụng Backgroundworker để đọc danh sách URL và gọi phương thức ủy nhiệm addTab Ngủ một chút cho đến khi trang được tải và tiếp tục với AddTab Invoke khác.

Khi danh sách là rỗng tôi kiểm tra xem trong trang DOM có một chuỗi nhất định Sau đó, trong Backgroundworker Complete Tôi Đóng tất cả các tab và Vứt bỏ họ và tôi bấm vào button1 mà bắt đầu Backgroundworker1.asyncall();

Có điều gì sai trái với Logic của tôi? Tôi cũng sẽ đăng mã, tôi cần nó quá dài nhưng tôi thực sự cần hiểu nơi nào có thể là lỗi chấm dứt đơn đăng ký của tôi. Nếu ai đó có thể giúp tôi để xem tại sao nó sụp đổ mà không có bất kỳ lỗi hoặc bất cứ điều gì tôi sẽ đánh giá cao điều đó.

private void Start_Back_Click(object sender, EventArgs e) 
    {       
     List<Links> tempList = getListFromWeb(); 

     if (!backgroundWorker1.IsBusy) 
     { 
      backgroundWorker1.RunWorkerAsync(tempGoogle); 
     } 
    } 

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
     { 
      List<Links> temp = (List<Links>)e.Argument; 
      foreach (Links link in temp) 
      {     
       if (backgroundWorker1.CancellationPending) 
       { 
        e.Cancel = true; return;      
       } 
       _busy.WaitOne(); 

       if (tabs.InvokeRequired) 
       { 
         m_addTab addTabInvoke = addTabUrl; 
         Invoke(addTabInvoke, new Object[] { link.url, link.StringToSearch }); 
       } 
      } 
      Thread.Sleep(2000); 
      if (tabs.InvokeRequired) 
      { 
       foreach (Browser tempBrowser in ListCurrentBrowser) 
       { 
        if (backgroundWorker1.CancellationPending) 
        { 
         e.Cancel = true; 
         return; 
        } 
        _busy.WaitOne(); 
        Thread.Sleep(1000); 
        m_SeachTab addSearchInvoke = addTabPSearch; 
        Invoke(addSearchInvoke, tempBrowser); 
       } 
      } 
     } 

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
     { //Check Stuff Error and Cancelled 
      if (e.Error != null) 
      {... } 
      else if (e.Cancelled) 
      { ....} 
      else //Else remove all tab 
      { 
       bool canRemove = this.TabCount >= 1; 
      if (canRemove) 
      { 
       WebBrowserTabPage tab = this.SelectedWebBrowserTagPage; 
       this.TabPages.Remove(tab); 
       tab.Dispose(); 
      } 
      **Start.Back.PerformClick();** //Click on button again to start another time the backgroundworker 
} 

}

+0

Rất khó bạn thực sự gặp lỗi hoặc ngoại lệ.Mã này khá không hài lòng, không có cách nào mà Start.Back.PerformClick() có thể hoạt động. Và không có mã BGW nào thực sự chạy trên chuỗi công nhân. Thêm một trình xử lý sự kiện cho sự kiện FormClosing của biểu mẫu và thiết lập một điểm ngắt trên nó. –

+0

Bạn đề nghị tạo mã nào tốt hơn? Có thể cho tôi biết làm thế nào tôi có thể quản lý nó? Tôi tạo BackGroundworker và sau đó? Làm thế nào tôi có thể khởi động lại backgroundworker khi nó chấm dứt? Tôi sẽ đánh giá cao nếu bạn có thể cho tôi biết làm thế nào tôi có thể viết một mã tốt hơn :) – user1107078

+1

có thể trùng lặp của [Ứng dụng sự cố với "Lỗi nội bộ trong .NET Runtime"] (http://stackoverflow.com/questions/4367664/application- bị lỗi-với-nội-lỗi-trong-mạng-thời gian chạy) –

Trả lời

0

Trên thực tế khi ngoại lệ unhandled xảy ra trong một thread toàn bộ quá trình được chấm dứt. Bạn cần chạy ứng dụng của mình dưới chế độ gỡ lỗi có cả hai hộp kiểm cho Gỡ lỗi/Ngoại lệ/Ngoại lệ thời gian chạy ngôn ngữ chung được đặt.

+0

đã làm, tôi kiểm tra tất cả các loại hộp dành cho ngoại lệ khả năng và vẫn không có gì. – user1107078

0

Thử đặt khối try/catch quanh mã của bạn trong backgroundWorker1_DoWork và đặt điểm ngắt trong mệnh đề catch, bạn sẽ có thể bắt ngoại lệ.

+0

đó là điều đầu tiên tôi làm nhưng .net runtime crash không ném bất kỳ ngoại lệ nào. – user1107078

2

Từ trang web của Microsoft: Bắt đầu với .NET Framework phiên bản 4, sự kiện này không được nêu ra cho các ngoại lệ làm hỏng trạng thái của quá trình, chẳng hạn như ngăn xếp ngăn xếp hoặc vi phạm truy cập, trừ khi trình xử lý sự kiện là quan trọng về bảo mật và có thuộc tính HandleProcessCorruptedStateExceptionsAttribute. Có thể bạn nên thử thêm thuộc tính đó.

Đối Application.ThreadException, từ trang web của Microsoft một lần nữa: "Để đảm bảo rằng không có kích hoạt của sự kiện này đang bỏ lỡ, bạn phải đính kèm một handler trước khi bạn gọi Application.Run." Trong code của bạn nó không phải là rõ ràng nếu bạn đính kèm trình xử lý trước khi gọi Application.Run.

Ngoài ra - bạn có thể muốn có khối try catch "generic" trên những nơi mà có thể được gọi unmanaged code:

try { 
// Code goes here 
} 
catch { //Unmanaged exceptions will be caught here as well. 

} 

try { 
// Code goes here. 
} 
catch(Exception ex){ // only managed exceptions are caught, avoid that in your case. 
} 

Việc đầu tiên sẽ bắt ngoại lệ không được quản lý trong khi thứ hai sẽ không.

Các vấn đề liên quan