2010-06-01 29 views
8

Chúng tôi biết rằng không thể thực thi mã điều khiển thuộc tính của bất kỳ phần tử giao diện người dùng nào từ bất kỳ chuỗi nào khác với chuỗi mà phần tử được khởi tạo trên ... Câu hỏi của tôi là: Tại sao ?Lý do cho hạn chế chuỗi giao diện .NET UI

Tôi nhớ rằng khi chúng ta sử dụng các thành phần giao diện người dùng COM, (trong COM/Visual Basic 6.0 ngày), tất cả các phần tử giao diện người dùng được tạo bằng cách sử dụng các lớp COM và các lớp đồng lưu trữ tài nguyên của chúng bằng mô hình bộ nhớ. -Local-Storage (TLS), nhưng khi tôi nhớ lại, điều này là bắt buộc vì một cái gì đó liên quan đến cách COM thành phần được xây dựng, và không nên có liên quan đến các yếu tố NET UI. Lý do cơ bản tại sao hạn chế này vẫn tồn tại là gì?

Có phải vì Hệ điều hành cơ bản vẫn sử dụng các lớp API Win32 dựa trên COM cho tất cả các phần tử giao diện người dùng, thậm chí cả các phần tử được thao tác trong một ứng dụng .NET được quản lý?

+0

Tôi thích suy nghĩ của bạn, cho rằng .net được cho là sẽ làm cho RAD nhanh hơn nữa, tại sao chúng ta nên * có * lo lắng về tất cả các chủ đề bắt chước. Tôi có nghĩa là không nên nó chỉ làm việc, và các. Net khuôn khổ làm việc tất cả những thứ ra cho chúng tôi. Thậm chí sâu sắc hơn tại sao Windows/Hệ điều hành không xem xét điều đó. –

+0

Một dự đoán khác về phần của tôi, nhưng tôi tưởng tượng rằng ý định là khi hệ điều hành đã được di chuyển hoàn toàn để sử dụng mã quản lý api và tự thoái vốn khỏi API Win32 cũ, hạn chế này sẽ biến mất ... nhưng không phải nếu có điều gì khác cơ bản đang diễn ra ... –

Trả lời

2

AFAIK, nó cơ bản hơn cả COM. Nó đi ngay xuống Windows API tốt. Tôi tin rằng các cửa sổ trong Windows dự kiến ​​sẽ được sở hữu bởi một chủ đề, thời gian. Mỗi luồng có bơm thông điệp riêng, gửi tin nhắn đến các cửa sổ mà nó sở hữu. Đó là một cấu trúc khá cơ bản của Windows - có lẽ một chút cổ xưa những ngày này, nhưng cơ bản. Cảm giác của tôi về mối quan hệ này giúp cho khả năng tương tác khi bạn cần tích hợp WPF vào các ứng dụng Windows Forms, hoặc nếu bạn cần khỉ với một đối tượng Windows ở một nơi khác trong ứng dụng của bạn bằng HWND mà bạn có ở đâu đó. Nó cũng có thể là những gì cho phép các phiên bản cũ của Windows (XP) để lưu trữ các ứng dụng WPF mà không có bất kỳ thay đổi kiến ​​trúc lớn nào đối với bản thân hệ điều hành.

+0

Nếu bạn chính xác, điều này có thể bị đảo ngược/modfied khi Api OS đã được di chuyển hoàn toàn để sử dụng mã được quản lý ... Nhưng nếu, tuy nhiên, có một lý do cơ bản hơn cho việc này, sau đó điều này có thể không thực hiện được /. –

+0

Như tôi đã hiểu, có những hệ điều hành khác đã cho phép điều này, và tôi tin rằng BeOS là một trong số họ. Họ thực sự đã cố gắng loại bỏ địa ngục ra khỏi hệ điều hành đó với dự đoán nhu cầu tương lai về tính song song. Tôi nghĩ rằng mỗi cửa sổ có một vài chủ đề để nó (một chuỗi rendering và một thread UI, mỗi * cửa sổ *, không phải cho mỗi ứng dụng) .... –

0

Từ http://msdn.microsoft.com/en-us/library/ms741870.aspx:

Về mặt lịch sử, Windows cho phép UI yếu tố để được truy cập chỉ bằng sợi đã tạo ra chúng. Điều này có nghĩa là rằng chuỗi nền phụ trách một số tác vụ dài hạn không thể cập nhật hộp văn bản khi hoàn tất. Windows thực hiện điều này để đảm bảo tính toàn vẹn của thành phần giao diện người dùng. Hộp danh sách có thể trông là lạ nếu nội dung của nó được cập nhật theo chủ đề nền trong khi vẽ.

+1

Vâng, tôi có thể làm điều này bây giờ, tôi chỉ cần gọi BeginInvoke() trên phần tử Kiểm soát giao diện người dùng, để chuyển sang chủ đề chính xác ... Các chức năng giao diện người dùng khuôn khổ riêng lẻ cần phải được mã hóa đơn có thể được mã hóa theo cách đó bất kể chúng được phép thực hiện trên một ... –

+0

Bạn có thể tìm thấy BackgroundWorker hữu ích: http://www.albahari.com/threading/part3.aspx#_BackgroundWorker. –

1

Có vẻ như bạn đang đề cập đến WPF thay vì lập trình Windows API chung. Tôi không có chuyên gia về WPF internals, nhưng đây là một vài mục về lý do tại sao giữ UI thao tác trong một thread UI là một ý tưởng tốt:

  1. Tránh deadlocks. Khi bạn có nhiều chuỗi chạy xung quanh, tất cả tài nguyên được chia sẻ phải được bảo vệ bằng một số loại khóa. Khi có nhiều khóa, có nguy cơ cao bị kẹt trong bế tắc - luồng A sở hữu khóa 1 nhưng đang chờ khóa 2, chủ đề B sở hữu khóa 2 nhưng đang chờ khóa 1. Điều này có thể tránh được theo thứ tự nghiêm ngặt khóa mua lại, nhưng bản chất con người rơi ngắn.
  2. Giảm nhu cầu tốn kém về khóa. Nếu bạn có thể yêu cầu tất cả các giao diện người dùng để thực thi trên luồng giao diện người dùng, bạn có thể loại bỏ rất nhiều khóa cần thiết để bảo vệ dữ liệu nội bộ.
  3. Giảm nguy cơ tạo các cửa sổ xử lý thuộc sở hữu của chủ đề không có vòng tin nhắn.

Mục cuối cùng là liên quan đến Win API. Khi một cửa sổ xử lý được tạo ra, nó là ràng buộc với thread đã ban hành các cuộc gọi CreateWindow. Tin nhắn được gửi đến cửa sổ xử lý đó sẽ được đặt trong hàng đợi tin nhắn được liên kết với chuỗi đó.Nếu chuỗi đó không xử lý thông báo cửa sổ, cửa sổ sẽ không phản hồi - UI bị đóng băng. Nếu một luồng khác cố gắng SendMessage đến cửa sổ đó, chuỗi đó cũng sẽ bị đóng băng chờ cuộc gọi đồng bộ hoàn thành. Snowballs này khá nhanh chóng vào xấu xí trên tất cả. Đây là lý do tại sao điều quan trọng là phải đảm bảo rằng bạn chỉ tạo các chốt cửa sổ trên các luồng được chuẩn bị để xử lý các thông báo cửa sổ.

Tại sao hàng đợi thông báo của xử lý cửa sổ bị ràng buộc vào một chuỗi cụ thể? Tôi không biết, nhưng tôi chắc rằng câu trả lời không phải là tầm thường.

+1

Tất cả đều đúng. Vẻ đẹp của WPF là bạn có được chuỗi hiển thị của riêng mình, vì vậy kịch bản cuối cùng của bạn không xảy ra. Bạn có thể thưởng thức bức tranh hoàn hảo của bạn, ứng dụng hoàn toàn không phản hồi cho nội dung trái tim của bạn trong WPF! ;-) –

+0

@dthpr [e, thực sự, không .. Tôi không phải là chuyên gia về WPF. Tôi đang đề cập đến các phần tử giao diện Net Winforms chuẩn. Và deadlocks xảy ra từ multi = Threading một cách chính xác, không phải từ luồng đơn trên chuỗi sai ... Hạn chế nghiêm trọng hơn yêu cầu luồng đơn, nó hạn chế mã thực thi (ngay cả trong một mẫu đơn luồng) trên bất kỳ luồng nào khác hơn một chuỗi mà phần tử giao diện người dùng đã được tạo. –

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