我在動態實例化一個表單。在創建句柄之前,我無法與表單上的組件(如TextBox)進行交互(否則,將引發異常)。在使用其組件之前,如何等待表單句柄已創建?
目前我阻止使用while循環線程:
public void OutputDesktopFrame(MessagingService service, DesktopFrame desktopFrame)
{
IRemoteDesktopView view = GetView(service);
view.UpdateFrame(desktopFrame);
}
private IRemoteDesktopView GetView(MessagingService service)
{
T view;
bool viewExists = _views.TryGetValue(service, out view);
if (viewExists == false)
{
view = CreateAndShowView(service);
}
return view;
}
private T CreateAndShowView(MessagingService service)
{
T remoteDesktopView = new T();
_views.Add(service, remoteDesktopView);
Thread pumpThread = new Thread(() => remoteDesktopView.ShowDialog());
pumpThread.Start();
while (remoteDesktopView.IsHandleCreated == false)
{
//Do not return until the handle has been created!
}
return remoteDesktopView;
}
我不喜歡這樣的機制。我正在尋找一個優雅的解決方案。
請注意我正在編寫一個接口。我想過使用ManualResetEvent或類似的東西,但必須在每個實現了界面的Form中實現和處理ManualResetEvent,這聽起來並不吸引我。如果你不同意我的話。這很好。我只是懷疑我目前的解決方案並不是最優雅的。
這段代碼非常沒用,Handle屬性在Show()方法返回後總會有一個有效值。到目前爲止,處理一個線程試圖敲擊一個表單的最簡單最簡單的方法是直到表單的Load事件觸發後才啓動線程。 –
@HansPassant你說得很好。我用更完整的代碼示例更新了我的問題。 –