Tôi đang viết một ứng dụng WinForms có hai chế độ: bảng điều khiển hoặc GUI. Ba dự án trong cùng một giải pháp, một cho ứng dụng giao diện điều khiển, một cho các biểu mẫu giao diện người dùng và thứ ba để giữ logic mà cả hai giao diện đều sẽ kết nối. Ứng dụng Console chạy hoàn toàn suôn sẻ.Lỗi giao diện người dùng chéo luồng lạ
Mô hình giữ lựa chọn người dùng, có một số IList<T>
trong đó T là đối tượng cục bộ, Step
, thực hiện INotifyPropertyChanged
, do đó, trong giao diện người dùng này được gắn kết vào một DataGridView. Tất cả là tốt khi chạy, trạng thái ban đầu của các đối tượng được phản ánh trên màn hình.
Mỗi đối tượng Step
là một tác vụ được thực hiện lần lượt; một số thuộc tính sẽ thay đổi, được phản ánh trở lại IList và truyền cho DataGridView.
Hành động này trong các phiên bản giao diện người dùng được thực hiện bằng cách tạo một sự kiện nâng cao BackgroundWorker trở lại giao diện người dùng. Các Step
hiện điều đó và tạo ra một đối tượng StepResult
mà là một loại liệt kê cho thấy một kết quả (ví dụ như chạy, NotRun, OK, NotOK, Caveat) và một chuỗi để chỉ ra một thông báo (vì bước chạy nhưng không hoàn toàn như mong đợi, tức là với một Caveat). Thông thường các hành động sẽ liên quan đến một tương tác cơ sở dữ liệu, nhưng trong chế độ gỡ lỗi, tôi ngẫu nhiên tạo ra một kết quả.
Nếu thông báo là null, không bao giờ có một vấn đề, nhưng nếu tôi tạo ra một phản ứng như thế này:
StepResult returnvalue = new StepResult(stat, "completed with caveat")
tôi nhận được một thông báo lỗi rằng DataGridView đã được truy cập từ một thread khác với thread nó đã được tạo vào. (Tôi đang vượt qua điều này thông qua một trình xử lý tùy chỉnh sẽ xử lý lời gọi khi được yêu cầu - có thể không?)
Sau đó, nếu tôi tạo ra một phản hồi duy nhất, ví dụ: sử dụng số ngẫu nhiên r
:
StepResult returnvalue = new StepResult(stat, r.ToString());
các hành động thành công mà không có vấn đề gì, các con số được viết gọn gàng vào DataGridView.
Tôi bị bối rối. Tôi giả sử nó bằng cách nào đó một vấn đề chữ chuỗi, nhưng bất cứ ai có thể đưa ra một lời giải thích rõ ràng hơn?
Không chính xác câu trả lời - nhưng dọc theo dòng bên phải! – Unsliced
Perfick! Chính xác những gì tôi cần để liên kết với các bộ sưu tập trong một DLL từ Winforms và WPF khách hàng, cảm ơn. – Wonko
Nó chỉ hoạt động nếu BindingList được tạo trong chuỗi giao diện người dùng, phải không? Nhưng có bất kỳ giải pháp nào, nếu BindingList <> được tạo bên ngoài luồng giao diện người dùng không? Và Không, chúng tôi không thể chuyển ISynchronizeInvoke hoặc SynchronizationContext tương ứng thành BindingList :( –