接続ハンドラ(ユーザ名とパスワードを要求するダイアログ)を作成しています。コードは、ダイアログを表示するハンドラです。このコードはスレッドから呼び出すことができるので、Invoke()
の場合はInvokeRequired
が必要です。コントロールを使用できないときに呼び出す方法()
Control
でハンドラを初期化して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
}
}
私の質問は以下のとおりです。
- 初期化()メソッドがUIThreadで実行されている場合は、私が
InitializeMethod()
- にヌル制御を渡すとどうなりますか、しますコードは後で作業しますか?
InvokeRequired
をテストするコントロールがない場合は、どのようなパターンを推奨しますか?事前に
おかげで
はEDIT:いくつかのテストをやって、私はInitialize()
にnullを渡すと、InvokeRequiredが返すように見えるので、コントロールは、UIスレッドで実行されていないことを認識しています偽です。常に。だから私の質問は、私は実際に(起きる)Invokeを実行することができます私はコントロールを持っていないですか?
EDIT2:mInvokeControl.CreateControl()
fixs問題を行います。
ログイン資格情報を取得するためのダイアログボックス/フォームを作成している場合は、それを呼び出しターゲットとして使用できるはずです。それ以外の場合、資格情報はどこから来ますか? –
@David Lively:はい、DoGetCredentialsコールでフォームを作成しています –