2

フォームを動的にインスタンス化しています。ハンドルが作成されるまで、フォーム上のコンポーネント (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 などを使用することを考えましたが、インターフェイスを実装する各フォーム内で ManualResetEvent を実装して処理する必要があるのは魅力的ではありません。あなたが私に同意しない場合。それでいいです。現在のソリューションが最もエレガントではないのではないかと思うだけです。

4

2 に答える 2

7

HandleCreated次のように、イベント ハンドラーにコードを追加できます。

private void Form1_HandleCreated(object sender, EventArgs e){
   //your code
}

イベントは [プロパティ] ウィンドウに表示されません。コードを使用してイベント ハンドラーを登録する必要があります。

HandleCreated += Form1_HandleCreated;
于 2013-07-02T10:55:48.347 に答える