Как я могу приспосабливать эту функцию для того, чтобы оно функционировало с (Async, Await, Task)?

У меня есть следующая функция, основанная на вопросе, который я реализовал, он делает время здесь:

Как позволять открывать несколько инстанций Формуляра под неким определенным условием?

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), затрудняет мне немного понимать это, и мне хотелось бы начинаться с этой функцией, чтобы понимать Ваше функционирование.

2
задан 21.03.2019, 15:50
1 ответ

Со мной случается, что решать твою проблему, ты обрезаешь, использовать 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();
        });
2
ответ дан 02.12.2019, 05:18
  • 1
    У меня нет полной уверенности в том, что таким образом была решена твоя проблема, porfavor комментируй мне, как он ты идет, чтобы оставлять / удалять ответ! – Juan Salvador Portugal 21.03.2019, 17:20
  • 2
    Нет, добавляя task async awit, он не подразумевает параллельную обработку, я говорю, что таким образом пользователь равного способа будет должен ждать, @JuanSalvador он был бы лучше удалять твой ответ. – Miguel Zarate 21.03.2019, 17:54
  • 3
    Потому что они проголосовали негативно, но это функционировало для меня, в том смысле, что он не блокирует интерфейс – J. Rodríguez 21.03.2019, 17:55
  • 4
    @Rodrigues, Если ты проверяешь вопрос, и комментарий занимается с Form, которая не хочет заслониться, не относится к другому независимому процессу. – Miguel Zarate 21.03.2019, 18:01
  • 5
    @JuanSalvadorPortugal, Если, всегда есть еще одна форма prá ctica делания этого, большое спасибо из-за того, что взял время ответа. – J. Rodríguez 21.03.2019, 21:45