接続ハンドラー (ユーザー名とパスワードを要求するダイアログ) を作成しています。コードは、ダイアログを表示するハンドラーです。このコードはスレッドから呼び出すことができるので、Invoke()
ifが必要ですInvokeRequired
。
Control
理想的な状況では、 to doでハンドラーを初期化できますInvokeRequired
が、Control が null になることもあります。出来ますか?コードをどのように実装できますか? 以下は正しいですか?
public class GuiCredentialsHandler
{
// control used to invoke if needed
private static Control mInvokeControl;
/// <summary>
/// Initialize a GetCredentials handler for current process.
/// This method should be always called from the main thread, for
/// a correctly handling for invokes (when the handler is called
/// from a thread).
/// </summary>
/// <param name="parentControl">Application top form.
/// Can be null if unknown</param>
public static void Initialize(Control parentControl)
{
if (parentControl != null)
{
mInvokeControl = parentControl;
}
else
{
mInvokeControl = new Control();
// force to create window handle
mInvokeControl.CreateControl();
}
}
public static Credentials GetCredentials()
{
if (mInvokeControl.InvokeRequired)
{
return mInvokeControl.Invoke(
new GetCredentialsDelegate(DoGetCredentials), null)
as Credentials;
}
else
{
return DoGetCredentials();
}
}
private static Credentials DoGetCredentials()
{
// the code stuff goes here
}
}
私の質問は次のとおりです。
- null コントロールを
InitializeMethod()
- UIThread で Initialize() メソッドを実行すると、コードは後で機能しますか?
- テストするコントロールがない場合に推奨されるパターンは何
InvokeRequired
ですか?
前もって感謝します
EDIT : いくつかのテストを行ったところ、null を に渡すとInitialize()
、コントロールが UI スレッドで実行されていないため、InvokeRequired が false を返すように見えることがわかりました。いつも。だから私の質問は、私が制御できないときにどうすれば本当の(フィアブル)呼び出しを実行できるのですか?
EDIT2:mInvokeControl.CreateControl()
実行すると問題が修正されます。