2013-01-02 30 views
7

Tôi có một ứng dụng WPF với XAML rất phức tạp, tôi cần một cách để biết điểm ứng dụng của tôi bị treo, khi nào tôi cố gắng để tạm dừng việc thực hiện, ứng dụng dường như không được treo, con trỏ sẽ được trên dòng này:Treo ở vị trí không xác định trong một ứng dụng WPF rất phức tạp khi bố cục cửa sổ thay đổi do tạo ReportViewr trong một chủ đề khác

System.Windows.Application myApp; 
. 
. 
. 
. 
myApp.Run(); // <== this line 

này đang xảy ra khi tôi thay đổi cách bố trí của các thanh tác vụ hoặc khi cửa sổ nhà thám hiểm bị rơi (nhiệm vụ Nếu tôi thực hiện những thay đổi đó trong một sự lặp lại nặng nề, ứng dụng sẽ không bao giờ phục hồi, nhưng khi một thay đổi nhỏ được thực hiện, ứng dụng sẽ phục hồi sau vài phút, tôi cần biết nguyên nhân của vấn đề này. XAML của ứng dụng của tôi, nhưng tôi cần một cách để biết trang hoặc thành phần, hoặc bất kỳ nguồn gốc nào của trang này.

* EDIT *

Tôi cần một công cụ hoặc một cách để biết XAML mà tốn thời gian điều phối là gì!

* EDIT *

tôi đã có lý do chính xác của hang, đó là vì tạo ra một thể hiện của ReportViewer trong chủ đề khác, Khi tôi loại bỏ việc tạo ra các trường hợp, nó làm việc một cách hoàn hảo, các điều kỳ lạ, đó là sai lầm này được tồn tại trong ứng dụng của tôi thời gian dài trước đây, nhưng được hang đã quyên góp được gần đây, tôi có nghĩa là: ứng dụng của tôi sẽ bị treo khi bạn chèn một trong các mã trong bất kỳ vị trí của ứng dụng của tôi:

 new Action(() => 
     { 
      ReportViewer rv = new ReportViewer(); 
     }).BeginInvoke(null, null); 

HOẶC

 new Action(() => 
     { 
      ReportViewer rv = new ReportViewer(); 
      rv.Dispose(); 
     }).BeginInvoke(null, null); 

HOẶC

 new Action(() => 
     { 
      ReportViewer rv = new ReportViewer(); 
      rv.LocalReport.ReleaseSandboxAppDomain(); 
      rv.Dispose(); 
     }).BeginInvoke(null, null); 

Câu hỏi của tôi:

1- mối quan hệ giữa thay đổi cách bố trí của cửa sổ (Thay đổi kích thước các thanh tác vụ hoặc di chuyển nó) và người xem báo cáo mà không được thêm vào là gì bất kỳ cây hình ảnh nào, tại sao điều này khiến ứng dụng của tôi bị treo ???

2- Cách tôi có thể xác định vị trí của hang?

3- Một số lần ứng dụng sẽ khôi phục trong vài phút (3-5), nhưng một số lần treo vẫn trong nhiều giờ và ứng dụng sẽ không phục hồi, Tại sao?

4 - Làm cách nào tôi có thể xác định thành phần hoặc cấu hình đã khiến ứng dụng của tôi bị treo trong trường hợp này? Bằng cách này, điều này rất hữu ích cho những người khác nếu được giải quyết, Chúng tôi đã dành rất nhiều thời gian để phát hiện nó, nhưng không có lý do chính xác kết hợp với ReportViewer gây treo!

+0

Bạn luôn có thể thử một trong những mã công cụ profiling như ANTS Red Gate (Tôi nghĩ rằng họ vẫn làm miễn phí thử nghiệm). Điều đó sẽ ít nhất cung cấp cho bạn nơi mã đã dành thời gian - nó có thể không phát hiện ra các bế tắc tiềm ẩn (nó có thể là các nhiệm vụ chạy dài hoặc deadlocks trong số những thứ khác) – Charleh

+0

Đã thử nó trong nhiều ngày, tôi không có bất kỳ thông tin hữu ích nào! đã thử công cụ gỡ lỗi gỡ lỗi-diag và các công cụ gỡ lỗi cửa sổ khác, nhưng không có điểm đặc biệt khi ứng dụng của tôi bị treo, tôi khá chắc chắn, đó là vì một số XAML xấu, tôi cần các công cụ để xem điểm mà điều phối bị treo trong XAML. –

+0

Điều này có xảy ra trên nhiều máy không? – Charleh

Trả lời

7

tôi sẽ cố gắng trả lời câu hỏi của bạn như là hoàn toàn như tôi có thể:

Việc kiểm soát ReportViewer là một Windows Forms điều khiển và Windows Forms có một vấn đề mà có thể gây ra, trong những trường hợp thích hợp, thread UI để khóa và do đó, ứng dụng để treo.

Khi thông báo WM_SETTINGCHANGED được đăng bởi Windows, sự kiện System.Win32.SystemEvents.UserPreferenceChanged bị kích hoạt. Một số điều khiển Windows Forms bao gồm ReportViewer lắng nghe sự kiện này để tự cập nhật khi cài đặt hệ thống thay đổi.

Sự kiện UserPreferenceChanged và ngược lại với các sự kiện thông thường khác sẽ gọi cho mỗi trình xử lý bằng cách sử dụng SynchronzationContext của chuỗi đăng ký. Vì vậy, nếu ReportViewer được tạo trên một chủ đề khác với chuỗi giao diện người dùng chính (chuỗi điều phối trong WPF), mã kích hoạt sự kiện sẽ cố gắng thực hiện cuộc gọi và chờ cuộc gọi được hoàn thành sẽ không bao giờ xảy ra với chuỗi khác do đó đóng băng giao diện người dùng .

Để xác định vị trí của hang, bạn có thể dễ dàng vô hiệu hóa tùy chọn Enable Just my code trong Visual Studio -> Tools -> Options -> Debugging và khi treo xảy ra chỉ cần đính kèm trình gỡ rối VS vào ứng dụng treo của bạn bạn rằng ứng dụng được treo bên trong xử lý sự kiện UserPreferenceChanged trên một cuộc gọi WaitOne.

Bạn có thể đọc thêm về điều này treo trong những bài viết này:

http://www.ikriv.com/dev/dotnet/MysteriousHang.html

Windows Forms Form hanging after calling show from another thread

+0

Bạn thật tuyệt vời, bạn đã có nó mà không cần bất kỳ mã nào !! –

0

Sau khi tạm dừng trong trình gỡ rối VS, mở cửa sổ Chủ đề trên menu Gỡ lỗi/Windows. Chọn tất cả và đóng băng chúng (từ menu ngữ cảnh). Sau đó, nhấp đúp vào từng chuỗi để xem vị trí bị kẹt. Ngoài ra, nhấp chuột phải vào ngăn xếp cuộc gọi và hiển thị mã bên ngoài.

+0

Không cho tôi điểm gây treo, luồng chính đang ngủ, tham gia nhưng không biết –

2

Đơn giản - không tạo ReportViewer trong chuỗi khác. Tất cả các yếu tố buộc vào một phân cấp UI phải đến từ chuỗi giao diện người dùng.

Trong hành động tạo, hãy gọi lại chuỗi giao diện người dùng để thực hiện việc tạo thực tế trong chuỗi giao diện người dùng.

+0

Tôi biết rằng, tôi đã làm điều này như tôi đã đề cập trong câu trả lời của tôi, vấn đề là tôi lo lắng về lý do chính kết hợp với người báo cáo và gây treo cổ, The hang có thể được nêu ra trong một hoàn cảnh khác và bởi vì một thành phần khác với ReportViwer! Tôi cần biết lý do chính. hoặc một cách để tìm ra lý do chính trong đơn xin của tôi, và tôi sẽ tuyên bố nó ở đây nếu tôi tìm thấy nó. –

+0

Lý do chính vẫn là như nhau - luồng STA là bắt buộc. Mỗi thành phần có thể hiển thị hành vi này khi bạn bỏ qua khối xây dựng cơ bản của bất kỳ giao diện người dùng cửa sổ nào trong 30 năm qua. – TomTom

+0

Tôi biết rằng tôi có một sai lầm ở một số điểm, tôi cần phải biết điều đó, hành vi treo không có ở đây khi tạo trình báo cáo trong một chủ đề khác, nhưng bây giờ, vì lý do không rõ (tôi muốn biết) chương trình đang treo khi thực hiện nó, đây là câu hỏi của tôi. –

0

có một số thủ thuật tôi muốn sử dụng trên occations như:

tôi có câu trả lời này đã có trong How can I debug an internal error in the .NET Runtime?

nhưng điều này nên bao gồm vấn đề của bạn cũng như nó ghi mọi hành động cho đến khi CLR sụp đổ

IntelliTraceEvents và thông tin cuộc gọi là một thủ thuật tuyệt vời để tìm thấy những gì đã xảy ra trước khi bị nghiền nát xảy ra

Tools-> Debugging-> Gener al-> Enable .Net Framework Debugging

+

Tools-> IntelliTace-> IntelliTraceEvents Và Thông tin Gọi

+

Tools-> IntelliTace-> Set StorIntelliTace Recordings trong thư mục này

và chọn một thư mục

sẽ cho phép bạn bước INTO .net mã và theo dõi mọi hàm đơn ca ll. Tôi đã thử nó trên một dự án mẫu nhỏ và nó hoạt động

sau mỗi phiên gỡ lỗi mà nó giả sử để tạo bản ghi của phiên gỡ lỗi. nó là thư mục được thiết lập ngay cả khi CLR chết nếu im không nhầm

điều này sẽ cho phép bạn nhận cuộc gọi được mở rộng trước khi CLR bị sập.

Asecond lừa

mà có thể được sử dụng trong sản xuất là khuôn khổ tuyệt vời này được gọi là PostSharp:

thông báo hướng dẫn này:

http://www.sharpcrafters.com/solutions/logging

sau khi bạn sử dụng PostSharp như mô tả.

bạn có thể cho mọi chức năng duy nhất trong hệ thống của mình khi nó được nhập khi nó được kết thúc và nếu một ngoại lệ được ném vào nhật ký tất cả các biến.

và thực hiện tất cả điều này bằng một vài dòng mã.