Я пишу обработчик соединения (диалог для запроса имени пользователя и пароля). Код является обработчиком, который показывает диалог. Этот код может быть вызван из потока, поэтому мне нужно Invoke()
, если InvokeRequired
.
В идеальной ситуации я могу затем инициализировать обработчик с Control
, чтобы сделать InvokeRequired
, но иногда Control может быть нулевым. Является ли это возможным? Как я мог реализовать код? Правильно ли следующее?
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
}
}
Мои вопросы:
- Что произойдет, если я передам нулевой элемент управления
InitializeMethod()
- Если метод Initialize () выполняется в UIThread, будет ли код работать позже?
- Какой шаблон рекомендуется, если у вас нет контроля для проверки
InvokeRequired
?
Заранее спасибо
EDIT : выполняя некоторые тесты, я понял, что, если я передаю ноль в Initialize()
, элемент управления не запускается в потоке пользовательского интерфейса, поэтому InvokeRequired, похоже, возвращает false. Всегда. Поэтому мой вопрос: как я могу выполнить настоящий (надежный) Invoke, когда у меня нет контроля?
EDIT2 : Выполнение mInvokeControl.CreateControl()
устраняет проблему.