У меня есть следующая функция, основанная на вопросе, который я реализовал, он делает время здесь:
Как позволять открывать несколько инстанций Формуляра под неким определенным условием?
public void AbrirFormulario(Func metodofactory,string textoForm = "", bool multiplesInstancias=false) where T : Form
{
//Buscar el formulario dentro del panel.
Form formulario;
if (string.IsNullOrEmpty(textoForm))
formulario = panel_contenedor.Controls.OfType().FirstOrDefault();
else
formulario = panel_contenedor.Controls.OfType().Where(f => f.Text.Equals(textoForm)).FirstOrDefault();
if (formulario != null)
{
if (string.IsNullOrEmpty(Convert.ToString(formulario.Tag)) ||
(bool)formulario.Tag==false || formulario.Text == textoForm)
{
//Si la instancia esta minimizada la dejamos en su estado normal
if (formulario.WindowState == FormWindowState.Minimized)
{
formulario.WindowState = FormWindowState.Normal;
}
//Si la instancia existe la pongo en primer plano
formulario.BringToFront();
return;
}
}
//Se abre el form
formulario = metodofactory();
formulario.TopLevel = false;
if (multiplesInstancias == true)
formulario.Tag = multiplesInstancias;
if (multiplesInstancias == true && !string.IsNullOrEmpty(textoForm))
formulario.Text = textoForm;
panel_contenedor.Controls.Add(formulario);
panel_contenedor.Tag = formulario;
formulario.BringToFront();
formulario.Show();
}
Которая функционирует верно хорошо, но в момент выполнения ее например:
AbrirFormulario(() => new Form1(true, "parametro2"), "Titulo", true);
До тех пор, пока функция не заканчивает делать все утверждения, мой интерфейс (UI) блокирован, мне хотелось бы начинать использовать (Async, Await, Task) в этой функции так что, когда будет работать вышеупомянутая функция, я работал, и смог продолжать использовать мой интерфейс.
Выражение это: Они могут помогать мне приспосабливать эту функцию для того, чтобы оно функционировало с (Async, Await, Task), чтобы работать параллельной формы?
Моя настоящая среда работы: Визуальный Studio 2017 с.NetFrameWork 4.5.2
Заметь: Никогда я не использовал (Async, Await, Task), затрудняет мне немного понимать это, и мне хотелось бы начинаться с этой функцией, чтобы понимать Ваше функционирование.
Со мной случается, что решать твою проблему, ты обрезаешь, использовать Task. Run вместе с async/await и санкционируя InvokeRequired , когда он будет необходим
public async Task AbrirFormulario<T>(Func<T> metodofactory, string textoForm = "", bool multiplesInstancias = false) where T : Form
{
//Hago un await de la tarea
await Task.Run(() =>
{
Form formulario;
if (string.IsNullOrEmpty(textoForm))
formulario = panel_contenedor.Controls.OfType<T>().FirstOrDefault();
else
formulario = panel_contenedor.Controls.OfType<T>().Where(f => f.Text.Equals(textoForm))
.FirstOrDefault();
if (formulario != null)
{
if (string.IsNullOrEmpty(Convert.ToString(formulario.Tag)) || (bool) formulario.Tag == false || formulario.Text == textoForm)
{
//Si la instancia esta minimizada la dejamos en su estado normal
if (formulario.WindowState == FormWindowState.Minimized)
{
formulario.WindowState = FormWindowState.Normal;
}
//Si la instancia existe la pongo en primer plano
formulario.BringToFront();
return;
}
}
//Se abre el form
formulario = metodofactory();
formulario.TopLevel = false;
if (multiplesInstancias == true)
formulario.Tag = multiplesInstancias;
if (multiplesInstancias == true && !string.IsNullOrEmpty(textoForm))
formulario.Text = textoForm;
//Valido si es necesario usar un método de invocación o no
if (InvokeRequired)
{
//En caso de serlo, utilizo Invoke para modificar el UI
this.Invoke(new Action(() =>
{
panel_contenedor.Controls.Add(formulario);
panel_contenedor.Tag = formulario;
formulario.BringToFront();
formulario.Show();
}));
}
//Caso contrario, lo modifico normalmente
else
{
panel_contenedor.Controls.Add(formulario);
panel_contenedor.Tag = formulario;
formulario.BringToFront();
formulario.Show();
}
});
}
Сейчас, чтобы называть ее funciГіn, например в одном botГіn
private async void button1_Click(object sender, EventArgs e)
{
await AbrirFormulario(() => new Form1(true, "parametro2"), "Titulo", true))
.ContinueWith((c) => MessageBox.Show("El formulario terminó de cargar."));
}
Edit: То, что он передает, чтобы удваивать cГіdigo, что со мной случается, состоит в том, чтобы использовать одну funciГіn, немного asГ-:
public void ModificarUI(Action action)
{
if (InvokeRequired)
Invoke(action);
else
action();
}
Тогда despuГ©s, когда ты будешь нуждаться, прямо ты это называешь asГ -
ModificarUI(() => {
panel_contenedor.Controls.Add(formulario);
panel_contenedor.Tag = formulario;
formulario.BringToFront();
formulario.Show();
});