Làm việc trên một dự án hiện có, tôi phải sử dụng WinForms (không làm việc với nó một thời gian) và đã gặp sự cố khi đồng bộ hóa với chuỗi giao diện người dùng.Nhân viên đồng bộ với chuỗi giao diện người dùng
Thiết kế tôi phải tích hợp với các công trình như sau: A BackgroundWorker
nhận một tham số Action
và thực thi nó một cách không đồng bộ. Hành động tôi đang làm việc có hai phần; một lớp lõi (có chứa logic nghiệp vụ) và một phần GUI được thông báo bởi lõi thông qua các sự kiện nếu nó phải yêu cầu tương tác của người dùng.
Tôi đã thêm việc tạo xử lý để các nhà xây dựng có dạng
if (!IsHandleCreated)
{
//be sure to create the handle in the constructor
//to allow synchronization with th GUI thread
//when using Show() or ShowDialog()
CreateHandle();
}
Với điều này, đoạn mã sau hoạt động:
private DialogResult ShowDialog(Form form)
{
DialogResult dialogResult = DialogResult.None;
Action action = delegate { dialogResult = form.ShowDialog(); };
form.Invoke(action);
return dialogResult;
}
Đối với ví dụ này, địa điểm khởi động đã được thiết lập để cửa sổ mặc định.
Nếu tôi thay đổi nó để:
Action action = delegate { dialogResult = form.ShowDialog(ParentWindow); };
đâu ParentWindow
là một thể hiện của IWin32Window
và WindowStartupLocation
được thiết lập để CenterParent
. Tôi nhận được một ngoại lệ cross-thread khi gọi form.Invoke(action)
.
Thao tác chéo không hợp lệ: Kiểm soát 'Kích hoạt xác nhậnĐược tìm thấy' từ một chuỗi khác với chuỗi được tạo.
Câu hỏi:
- Tại sao lại có một sợi ngoại lệ chéo chỉ khi thiết lập các vị trí khởi động như
CenterParent
? Và làm thế nào để tránh nó? - Tại sao luôn là
false
?
Cả hai đều có thể liên quan !?
[sửa] @Reniuz: Bạn sẽ không bỏ lỡ bất cứ điều gì ở đây;) Cuộc gọi đang được thực hiện từ một người nghe được thông báo của lõi
private static void OnActivationConfirmationRequired(DmsPackageConfiguratorCore sender,
ConfigurationActivationConfirmationEventArgs args)
{
args.DoAbort = (ShowDialog(new ActivationConfirmationForm(args.Data)) == DialogResult.No);
}
Tất cả mọi thứ theo ý của tôi là trong GUI interface
/// <summary>
/// Interface defining methods and properties used to show dialogs while performing package specific operations
/// </summary>
public interface IPackageConfiguratorGui
{
/// <summary>
/// Gets or sets the package configurator core.
/// </summary>
/// <value>The package configurator core.</value>
IPackageConfiguratorCore PackageConfiguratorCore { get; set; }
/// <summary>
/// Gets or sets the parent window.
/// </summary>
/// <value>The parent window.</value>
IWin32Window ParentWindow { get; set; }
/// <summary>
/// Gets the package identifier.
/// </summary>
/// <value>The package identifier.</value>
PackageIdentifier PackageIdentifier { get; }
}
là trường hợp ngoại lệ vượt qua do 'CenterParent' hoặc vì bạn đang thực sự đặt cửa sổ chính (tức là nó vẫn kích hoạt nếu bạn xóa cài đặt' CenterParent')? – Strillo
@Strillo luôn luôn kích hoạt khi thiết lập biểu mẫu ParentWindow – Philippe
gọi để hiển thị chính nó? Hay Iam thiếu cái gì ở đây? Bạn có thể đăng tất cả mã không? – Reniuz