Windows Mobile 用のアプリを開発しています。これには 1 つのメイン フォームが含まれ、ユーザー UI は個々の UserControls で実装されます。ユーザーが [Menu] > [Ship Product] をクリックすると、ShipProduct UserControl がメイン フォームの Controls 配列に追加され、表示されます。ユーザーが ShipProduct UC を使用したら、InputBox 機能を提供したいと考えています。これが私が試したものです(疑似)。InputBox をメイン フォームに追加するデリゲートを除いて、戻りません。are.WaitOne() が UI と同じスレッド上にあるためだと思います。
これを実装するにはどうすればよいですか?
YieldAwait ライブラリ (http://yieldawait.codeplex.com) を使用して回避策を見つけましたが、非常に複雑なソリューションであることが判明しています。
<pre>
Main()
{
MainForm form = new MainForm();
Application.Run(form);
}
MainForm: Form
{
public AutoResetEvent are = new AutoResetEvent(false);
Menu_click()
{
this.Controls.Add(new ShipProduct)
}
}
InputBox: UserControl
{
OK_Button_click()
{
form.are.Set();
}
}
ShipProduct: UserControl
{
void GetUserInput()
{
Thread t = new Thread(ShowInputBox);
t.Start();
form.are.WaitOne();
}
void ShowInputBox()
{
InputBox ib = new InputBox();
form.Invoke
(
delegate {
form.Controls.Add(ib);
ib.Show();
}
/***/
// delegate never returns!
)
}
}
</pre>